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