現在有很多防注入程序屏蔽了 and、1=1、1=2 類似這樣的關鍵字,使用這樣的方法有時不能探測到注入點了。那么是否有新的方法能夠探測注入點呢? 經過一段時間的研究,發現了更好的方法。哈哈,特此共享一下。
現在假設有一個新聞頁面,URL 是 http://gzkb.goomoo.cn/news.asp?id=123,
1. 在瀏覽器中打開,可以看到一個正常的新聞頁面;
2. 在URL地址后面加上-1,URL變成:http://gzkb.goomoo.cn/news.asp?id=123-1,如果返回的頁面和前面不同,是另一則新聞,則表示有注入漏洞,是數字型的注入漏洞;在 URL地址后面加上 -0,URL變成 http://gzkb.goomoo.cn/news.asp?id=123-0,返回的頁面和前面的頁面相同,加上-1,返回錯誤頁面,則也表示存在注入漏洞,是數字型的。
否則:
3. 在URL的地址后面加上'%2B',URL地址變為:http://gzkb.goomoo.cn/news.asp?id=123'%2B',返回的頁面和1同;加上'2%2B'asdf,URL地址變為:http://gzkb.goomoo.cn/news.asp?id=123'%2B'asdf,返回的頁面和1不同,或者說未發現該條記錄,或者錯誤,則表示存在注入點,是文本型的。
為什么這樣可以呢?
我們可以從程序的角度來考慮一下。程序員的這條語句大致應該是這樣的:
select * from news where id=123
當我們在后面加上 -1 后,語句變為
select * from news where id=123-1
SQL服務器在執行這條語句時會進行運算,實際執行的是:
select * from news where id=122
這樣選出來的就是另外一條新聞記錄了。如果該記錄存在,就是另一則新聞;否則會顯示記錄不存在,或者出錯。呵呵。 這也同時表示程序未對輸入的數據進行過濾,存在數值型的注入漏洞。
如果 SQL 語句時這樣的:
select * from news where id='123'
那么我們在后面加上 '%2B' 之后,語句變為
select * from news where id='123'+''
%2B 是 + 的URL編碼。 這樣之后,SQL服務器實際執行的是:
select * from news where id='123'
會返回同樣的頁面。
加上 '%2B'asdf 之后,語句變為
select * from news where id='123'+'asdf'
實際執行的是:
select * from news where id='123asdf'
返回頁面不存在,或者顯錯。 這就表示有文本型的注入漏洞。
測試例子:以下三個地址,用 and 1=1 的方法來測試,都會有注入程序提示,但是用 -1 的方法均可以測試出是注入點:
http://www.xxx.gov.cn/readnews.asp?id=2703
http://zsb.xxxx.edu.cn/Article.asp?id=99
http://gs.xxx.edu.cn/dsjs.asp?id=659