前言:
現(xiàn)在的網(wǎng)絡(luò),腳本入侵十分的流行,而腳本注入漏洞更是風(fēng)靡 界,
扔掉工具,讓你飛速學(xué)會手工注入!
。不管是老鳥還是新起步的小菜,都會為它那巨大的威力和靈活多變的招式所著迷!正是因?yàn)樽⑷牍舻牧餍校沟氖忻嫔系淖⑷牍ぞ邔映霾桓F!比較出名的有小竹的NBSI、教主的HDSI和啊D的注入工具等等!這大大方便的小菜們掌握注入漏洞!可是,工具是死的,注入的手法卻是活的,能否根據(jù)實(shí)際情況靈活地構(gòu)造SQL注入語句,得到自己想要的信息,是[被屏蔽的不受歡迎關(guān)鍵詞]高shou 與小菜的根本區(qū)別!只用工具,而不去管它的原理,是不可能得到提高的,當(dāng)然,在遇到一些特殊情況的時(shí)候,那些只會用工具的小菜們也只能放棄了!所以學(xué)會手工注入自己構(gòu)造SQL注入語句是一個(gè) 愛好者必上的一堂課!我希望這篇文章能夠給那些還不會手工注入的朋友一點(diǎn)啟發(fā)!幫助大家早日擺脫工具,早日踏入 [被屏蔽的不受歡迎關(guān)鍵詞]高shou的行列!
惡補(bǔ)基礎(chǔ):
要想學(xué)會手工注入,有一個(gè)名詞是不得不提的,那就是數(shù)據(jù)庫系統(tǒng)!
1。簡介
數(shù)據(jù)庫系統(tǒng)分為數(shù)據(jù)庫和數(shù)據(jù)庫管理系統(tǒng)!數(shù)據(jù)庫是存放數(shù)據(jù)的地方,數(shù)據(jù)庫管理系統(tǒng)則是管理數(shù)據(jù)庫的軟件!數(shù)據(jù)庫中數(shù)據(jù)的存儲節(jié)構(gòu)叫數(shù)據(jù)模型!有四種常見的數(shù)據(jù)模型,分別是層次模型、網(wǎng)狀模型、關(guān)系模型和面向?qū)ο竽P汀F渲嘘P(guān)系數(shù)據(jù)模型是最主要的數(shù)據(jù)模型,ACCESS、MSSQL、ORACLE等都是關(guān)系模型數(shù)據(jù)庫系統(tǒng)。其中以ACCESS、MSSQL數(shù)據(jù)庫系統(tǒng)最為常見!這些都是理論的知識,希望大家理解!
2;靖拍
表:表是一個(gè)關(guān)系數(shù)據(jù)庫的基本組成元素!它按行與列組合排列成相關(guān)信息。通常行稱為記錄,列稱為域。每個(gè)域稱為一個(gè)字段!每一條記錄都由多個(gè)字段組成。每個(gè)字段的名字叫做字段名,每個(gè)字段的值叫估字段值。表中的每一行即每一條記錄都擁有想同的結(jié)構(gòu)!如圖1。
圖1中的這張表里有14行,即14條記錄。有4列,即4個(gè)字段,4個(gè)字段的名字分別叫:job_id(下面對應(yīng)的1、2、3等都是這個(gè)字段的值,后面三個(gè)字段的值舉一反三。 、job_ desc、 min_lvl、max_lvl。因?yàn)楸疚牟皇菍Vv數(shù)據(jù)庫知識的,所以這里只講一些最重要的概念,有興趣的朋友可以自己去查看數(shù)據(jù)庫的有關(guān)資料!
3。注入的條件
只有調(diào)用數(shù)據(jù)庫的動(dòng)態(tài)頁面才有可有存在注入漏洞,動(dòng)態(tài)頁面包括asp php jsp cgi等。本文只講對ASP頁面的注入。那什么是調(diào)用數(shù)據(jù)庫的頁面呢?比如這樣的形勢:
asp?id= php?id= 這樣的樣子的都是調(diào)用數(shù)據(jù)庫的頁面。"?"后面加的id的名字叫變量,注意這個(gè)變量是可以隨便換的,"="號后面的值名字叫參數(shù)!這個(gè)參數(shù)也是可以變的!大家的思路一定要靈活,要學(xué)會舉一反三,不要太死板!
4。注入漏洞的原理分析:
程序?qū)τ脩籼峤坏淖兞繘]有進(jìn)行有效的過濾,就直接帶入查詢語句中,這樣,我們就可以提交具有數(shù)據(jù)查詢功能的語句,加入到程序?qū)⒁峤坏男畔⒅腥,再根?jù)服務(wù)器返回的信息來判斷數(shù)據(jù)庫里的內(nèi)容!光這樣說大家可能不太好理解,不要緊,接著往下看。
有關(guān)的基礎(chǔ)已經(jīng)講完了 下面開始實(shí)戰(zhàn)練習(xí)部分!
實(shí)戰(zhàn)部分
如果是剛剛接觸注入的新手朋友,我們要做的第一步就是,用鼠標(biāo)右鍵點(diǎn)擊桌面上的IE圖標(biāo),再點(diǎn)屬性,然后再點(diǎn)“高級”,然后往下拉滾動(dòng)條,找到“顯示
友'好'HTTP錯(cuò)誤信息”,把前面的勾去掉,再點(diǎn)“確定”,這樣做是為了讓我們得到更多的服務(wù)器返回的信息!
第一部分:ACCESS數(shù)據(jù)庫手工注入
1。判斷是否存在注入漏洞:
這個(gè)相信大家都應(yīng)該知道! 就是在一個(gè)調(diào)用數(shù)據(jù)庫的網(wǎng)址后面加上分別加上 and 1=1和 and 1=2 ,如果加入and 1=1返回正常(就是和原來沒有加 and 1=1時(shí)頁面樣子的一樣),而加入 and 1=2返回錯(cuò)誤(和原來沒有加 and 1=2時(shí)頁面的樣子不一樣),就可以證明這個(gè)頁面存在注入漏洞。比如:
http://www.xxx.com/a.asp?id=7,這個(gè)網(wǎng)頁,我們在后面加上 and 1=1(兩個(gè)空格,and前面一個(gè),and和1=1之間一個(gè)!),網(wǎng)址就變成了
http://www.xxx.com/a.asp?id=7 and 1=1,用IE打開這個(gè)網(wǎng)頁,返回正常!再嘗試在后面加上and 1=2,網(wǎng)址就變成了
http://www.xxx.com/a.asp?id=7 and 1=2,同樣用IE打開這個(gè)網(wǎng)頁,返回錯(cuò)誤!這就說明這個(gè)網(wǎng)頁http://www.xxx.com/a.asp?id=7存在注入漏洞,是一個(gè)注入點(diǎn)。ù嬖谧⑷肼┒吹木W(wǎng)頁叫注入點(diǎn)!)可是,并不是所有的頁面都可以這樣判斷,有的頁面不管你加入 and 1=1 還是 and 1=2,返回的都是錯(cuò)誤的頁面,難道這樣的頁面就沒有注入漏洞嗎?不一定!比如這個(gè)頁面:http://www.xxxxxx.com/b.asp?id=ade7, 不管我們在后面上的是and 1=1還是and 1=2,它都返回錯(cuò)誤的頁面!這個(gè)時(shí)候我們就要嘗試用另一種方法來測試漏洞了,這種方法可以說是and 1=1和and 1=2的變種方法。原來的網(wǎng)址是這樣的:http://www.xxxxxx.com/b.asp?id=ade7,現(xiàn)在我們把它變成這個(gè)樣子:http://www.xxxxxx.com/b.asp?id=ade7' and '1'='1 ,用IE打開它,看看返回正不正常!如果正常,那就可以接著用這個(gè)地址來進(jìn)一步測試漏洞是否存在(如果返回不正常那這個(gè)頁面就很有可能不存在注入漏洞。篽ttp://www.xxxxxx.com/b.asp?id=ade7' and '1'='2 ,用IE打開這個(gè)網(wǎng)址,如果返回錯(cuò)誤的話,那這個(gè)網(wǎng)址http://www.xxxxxx.com/b.asp?id=1就存在注入漏洞!
A。數(shù)字型參數(shù)注入點(diǎn)分析!
這時(shí)肯定有朋友要問了,為什么用一開始那種and 1=1 and 1=2不行呢!呵呵,先不要急,先看看這兩個(gè)存在注入漏洞的頁面有什么不一樣?
(你不要告訴偶第二個(gè)網(wǎng)址比第一個(gè)網(wǎng)址多了幾個(gè)X),相信大家已經(jīng)看到了,第二個(gè)網(wǎng)址后跟的參數(shù)是ade7,是字符!而第一個(gè)網(wǎng)址后跟的參數(shù)是7,是數(shù)字!就是因?yàn)檫@里,才引起了測試漏洞的語句的不同!學(xué)過數(shù)據(jù)庫的朋友們應(yīng)該知道,在查詢中,字符型的值,是要用單引號包起來的,也就是這個(gè)樣子'字符型數(shù)據(jù)'。這里假設(shè)第一個(gè)注入頁面所對應(yīng)的查詢語句是這樣的(凡是調(diào)用數(shù)據(jù)庫的頁面都會有一條或者幾條對應(yīng)的查詢語句,用來對數(shù)據(jù)庫里的內(nèi)容進(jìn)行查詢。
:select * from 表名 where id=7。這是原來的那條查詢語句,這條語句是正確的,可以在數(shù)據(jù)庫中查詢出相應(yīng)的內(nèi)容!可是如果我們在網(wǎng)址后面加上了 and 1=1,那這條查詢語句就會變成select * from 表名 where id=7 and 1=1(這下知道了注入漏洞原理分析那里講的變量沒有過濾的意思了吧!),這里有必要說一些數(shù)據(jù)庫的有關(guān)知識,這條語句里,and是邏輯運(yùn)算符!(這個(gè)記住就行了),用中文翻譯過來就是“和”的意思!在高中的數(shù)學(xué)里講過,用“和”來連接的兩個(gè)句子,必須都是真的,不然整個(gè)句子就不是真的!比如:蘋果和大象都是水果。這句話就是錯(cuò)的,蘋果是水果,可是大象不是!這下大家應(yīng)該可以理解“用“和”來連接的兩個(gè)句子,必須都是真的,不然整個(gè)句子就不是真的”這句話了吧。如果換成蘋果和梨都是水果,那這句話就是對的。知道了and的用處后,再回來看select * from 表名 where id=7 and 1=1這個(gè)句子,and 前面的select * from 表名 where id=7肯定是對的,(為什么呢,如果這條查詢語句都不對,那這個(gè)注入頁而就有問題了!所以and前面的那個(gè)句子一定是對的。。再看and后面,1= 1,不用我說了吧,也是對的(難道一不等于一嗎?)根據(jù)剛才說的and用處,現(xiàn)在我們可以判定select * from 表名 where id=7 and 1=1這條查詢語句,仍然是對的!所以它還是可以正確地從數(shù)據(jù)庫里查詢出信息,返回給我們!
舉一反三,那這個(gè)句子:select * from 表名 where id=7 and 1=2,肯定是不對的了,那這條查詢語句就不能正確地從數(shù)據(jù)庫里查詢出信息,所以我們就會看到一個(gè)錯(cuò)誤的頁面! 以上是注入點(diǎn)參數(shù)是int(整數(shù)型)時(shí)的分析!
B。字符型參數(shù)注入點(diǎn)分析
和剛才一樣,我們先來看第二個(gè)字符型注入頁面里的查詢語句,比如是這個(gè)select * from 表 where id='ade7'(為什么加引號?看前面吧!),
電腦資料
《扔掉工具,讓你飛速學(xué)會手工注入!》(http://www.szmdbiao.com)。原來的查詢語句是這個(gè)樣子的,如果我們還按照數(shù)字型參數(shù)的那種測試漏洞的方法的話,語句就會變成這樣: select * from 表 where id='ade7 and 1=1'和select * from 表 where id='ade7 and 1=2' ,因?yàn)槌绦驎詣?dòng)查詢引號里的內(nèi)容,如果我們按前面這兩個(gè)語句這樣提交的話,程序就會查詢id值為ade7 and 1=1和ade7 and 1=2的記錄,這樣是查不到結(jié)果的(你可不要告訴我數(shù)據(jù)庫里正好有兩個(gè)記錄的id就是ade7 and 1=1 和and 1=2)。這里可能有朋友要問了,為什么不是查詢id為'ade7,然后and 1='1呢?好,我現(xiàn)在回答你們,就算可以查詢id值為'ade7的記錄,那這個(gè)句子也是錯(cuò)的,1怎么會等于'1呢?對吧?更何況程序是不可能查詢 'ade7的,更準(zhǔn)備的說是數(shù)據(jù)庫中不可能有一個(gè)字段的值是'ade7,因?yàn)檫@個(gè)字符串少一個(gè)引號,如果直接把這個(gè)字符串存入數(shù)據(jù)庫的話,程序會報(bào)錯(cuò)的!怎么樣?明白了吧?現(xiàn)在再說用 ' and '1'='1和' and '1'='2來測試的的原理!同樣是這個(gè)查詢語句:
select * from 表 where id='ade7',如果我們在網(wǎng)址后面加了' and '1'='1,那這個(gè)查詢語句就會變成
select * from 表 where id='ade7' and '1'='1'(這里最外面的那一層引號是程序自動(dòng)加上的),變成這個(gè)樣子!這個(gè)語句對不對呢?我們分析一下。如果我們提交個(gè)語句,那程序就會自動(dòng)查詢 id值是ade7的記錄!因?yàn)檫@個(gè)記錄是存在的(不存在的話那就是這個(gè)網(wǎng)頁有問題了。籥nd后面跟的'1'='1'是正確的,所以這個(gè)語句是正確的!如果我們把' and '1'='1換成' and '1'='2,那語句就成了select * from 表 where id='ade7' and '1'='2',只看后面我們就可以知道這個(gè)語句對不對了!'1'怎么可能等于'2'呢?是吧?好了,字符型參數(shù)的注入點(diǎn)的原理就介紹到這里!
2。數(shù)據(jù)庫類型的判斷
在確定了一個(gè)地址是注入點(diǎn)后,我們首先要判斷這個(gè)注入點(diǎn)所連接的數(shù)據(jù)庫的類型!這里介紹幾種簡單的方法。如果一種判斷不出來就再換另一種判斷方法!
A。在注入點(diǎn)后直接加上單引號。有的時(shí)候我們可以根據(jù)服務(wù)器報(bào)錯(cuò)的信息來判斷它用的是什么數(shù)據(jù)庫。如圖2!通過這個(gè)錯(cuò)誤信息我們可以看出來這個(gè)注入點(diǎn)所連接的數(shù)據(jù)庫的類型是ACCESS,為什么呢,仔細(xì)看!它說的是Microsoft JET Database Engine 錯(cuò)誤 '80040e14' ,說明是通過JET引擎連接數(shù)據(jù)庫,而不是ODBC!如果是用JET方法連接的話就說明用的是ACCESS數(shù)據(jù)庫,如果是ODBC的話就說明數(shù)據(jù)庫是 MSSQL!這個(gè)記住就行了。其實(shí)還有詳細(xì)的錯(cuò)誤信息,它直接把數(shù)據(jù)庫的類型告訴你了!因?yàn)槲覜]有找到這樣的注入點(diǎn),這里就截不了圖了。大家遇的到話肯定一眼就可以看出來!
B。在注入點(diǎn)后加上(注意,你先確定了它是注入點(diǎn)后再加,不是注入點(diǎn)你加了也沒用!): ;--(一個(gè)分號,兩個(gè)橫線。┍热邕@個(gè)網(wǎng)址
http://www.xxxxxxxx.com/article/as.asp?id=875,我們事先已經(jīng)確定了它是注入點(diǎn)了, 這樣的話我們就可以在后面加上;--讓它變成
http://www.xxxxxxxx.com/article/as.asp?id=875;-- 提交這個(gè)網(wǎng)址,如果頁面返回正常的話,說明數(shù)據(jù)庫是MSSQL。因?yàn)樵贛SSQL數(shù)據(jù)庫里,;和--都是存在的,";" 用來分離兩個(gè)語句,而"--"就是注釋符,在它后面的語句都不執(zhí)行!而ACCESS數(shù)據(jù)庫里沒有!所以如果是ACCESS的數(shù)據(jù)庫,當(dāng)你在注入地址
后面加上";--"的話那程序就會把";--"當(dāng)成參數(shù)的一部分,這樣查詢就會出錯(cuò)!如果錯(cuò)誤,那基本上可以肯定是ACCESS了(因?yàn)榫W(wǎng)上用這兩種數(shù)據(jù)庫的網(wǎng)站最多。
C。用以上方法都判斷不出來的話,那可以用這一招!利用ACCESS和MSSQL數(shù)據(jù)庫的差異來進(jìn)行判斷!要用到兩個(gè)查詢語句!同樣,如果注入點(diǎn)是http://www.xxxxxxxx.com/article/as.asp?id=875,那我們在后面加上 and exists (select count(*) from sysobjects),那么地址就變成了
http://www.xxxxxxxx.com/article/as.asp?id=875 and exists (select count(*) from sysobjects)。如果頁面正常返回,那就可以證明數(shù)據(jù)庫是MSSQL的。我來解釋一下這個(gè)語句:這個(gè)句子的意思是查詢sysobjects表里的記錄數(shù)大于0!(有點(diǎn)別扭。┤绻祷卣#f明大于0,也就說明存在sysobjects這個(gè)表,因?yàn)檫@個(gè)表只有MSSQL數(shù)據(jù)庫里才有,所以可以確定數(shù)據(jù)庫的MSSQL的!如果返回錯(cuò)誤,那就不是!那我們怎么用查詢語句來判斷數(shù)據(jù)庫是不是ACCESS的呢!別急,往下看!我們在注入點(diǎn)后加上 and exists (select count(*) from msysobjects)。就成了
http://www.xxxxxxxx.com/article/as.asp?id=875 and exists (select count(*) from msysobjects),按剛才理解MSSQL數(shù)據(jù)庫的方法去理解這條語句!這里要注意,提交這個(gè)語句是不會返回正常頁面的!就算是ACCESS數(shù)據(jù)庫也不會返回正常的頁面!因?yàn)槟J(rèn)情況下,我們是沒有權(quán)限查詢這個(gè)表里的數(shù)據(jù)的!不過WEB會提示我們 “記錄無法讀取;'msysobjects'沒有讀取權(quán)限”!如果返回的是這個(gè)錯(cuò)誤信息的話,那就證明是ACCESS數(shù)據(jù)庫了!如圖3!簡單地來說就是兩條查詢語句:
and exists (select count(*) from sysobjects)
and exists (select count(*) from msysobjects)
如果第一條返回正常,那就是MSSQL數(shù)據(jù)庫,如果兩條都不正常,那就是ACCESS數(shù)據(jù)庫了(這里只討論MSSQL和ACCESS)
注意:上面講的全是參數(shù)是int的時(shí)候的檢測方法,如果參數(shù)是字符型的,那就先要在參數(shù)后面加上單引號,然后再在查詢語句最后加上";--"
3。猜表、字段名、檢測記錄數(shù)、檢測字段長度。
我按照工具注入的流程給大家講!
A。猜表!
用到的語句:and exists (select count(*) from 你要猜的表名) 。在注入點(diǎn)后加上這句話,如果返回正常,說明你猜的表是存在的!比如
http://www.xxxxxxxx.com/article/as.asp?id=875 and exists (select count(*) from admin),如果返回正常,說明admin這張表存在!如果返回錯(cuò)誤,就說明不存在!。別的表也都是這么猜!
B。猜列!
用到的語句:and (select count(列名) from 猜到的表名)>0 。在注入點(diǎn)后加上這句話,如果返回正常,說明你猜的列是存在的!比如
http://www.xxxxxxxx.com/article/as.asp?id=875 and (select count(username) from admin)>0,如果返回正常,那username這個(gè)列就存在!不過首先要確定from后面跟的表名要是存在的哦!不然你怎么猜都是錯(cuò)的!
C。檢測記錄數(shù)
用到的語句:and (select count(*) from 猜到的表名)>X (X是個(gè)數(shù)字)。在注入點(diǎn)后加上這句話,并不停地變換X這個(gè)數(shù)字,直到猜到準(zhǔn)確的記錄數(shù)為止!比如http://www.xxxxxxxx.com/article/as.asp?id=875 and (select count(*) from admin)>2 ,這個(gè)句子是猜admin表里有幾條記錄的,也就是有幾個(gè)管理員(因?yàn)橐粋(gè)管理員對應(yīng)一條記錄嘛!)。如果返回正常,說明admin這張表里的記錄數(shù)大于 2。這個(gè)時(shí)候我們把2改成別的大一點(diǎn)的數(shù)!比如5,如果返回錯(cuò)誤,說明管理員的個(gè)數(shù)在2和5之間,2和5之間的整數(shù)是3和4,這個(gè)時(shí)候我們變換語句為http://www.xxxxxxxx.com/article/as.asp?id=875 and (select count(*) from admin)=3或者=4,哪個(gè)返回正常那管理員的個(gè)數(shù)就是哪個(gè)。如果提交>5還返回錯(cuò)誤,那就再取一個(gè)更大的數(shù),再重復(fù)剛才的動(dòng)作就可以猜到記錄數(shù)!
D。檢測字段長度
用到的語句:and (select top 1 len(列) from 表)>X (X和剛才一樣!)。我來解釋一下這個(gè)句子,select top 1是查詢第一條數(shù)據(jù)的意思。ㄔ赪EB環(huán)境下不支持多行回顯!只是一次查詢的數(shù)據(jù)不能超過一行。,len是MSSQL里的一個(gè)函數(shù),用法是len(), ()里可以是字符串也可以是表達(dá)式也可以是列名!知道這些,大家應(yīng)該可以看懂了吧!后面那個(gè)X的變換方法上面的一樣!