注入工具的原理和开发
生活随笔
收集整理的這篇文章主要介紹了
注入工具的原理和开发
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
“注入”這一詞眼下可算得上時髦,“大街小巷”到處都能“聽”到看到。這一詞曾經讓無數人“聞名色變”,今天我們的話題仍是注入。不過今天我們這里的這個注入不同于以往的,它有別于通常的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是瀏覽器向服務器提交報文通常所采用的兩種方法。服務器在收到報文之后,解碼分析出所需的數據并進行處理,最后返回結果。通常我們可以看到的都是像http://***.***.***.***/list.asp?id=***這樣的URL請求,我們可以自己構造如下的報文來完成 。
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;
}
……
總結
以上是生活随笔為你收集整理的注入工具的原理和开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 趣味故事嘛的facebook中文网
- 下一篇: GM也坐不住了的s9t9