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