日本好好热aⅴ|国产99视频精品免费观看|日本成人aV在线|久热香蕉国产在线

  • <cite id="ikgdy"><table id="ikgdy"></table></cite>
    1. 西西軟件園多重安全檢測(cè)下載網(wǎng)站、值得信賴的軟件下載站!
      軟件
      軟件
      文章
      搜索

      首頁(yè)西西教程數(shù)據(jù)庫(kù)教程 → 網(wǎng)站SQL注入語(yǔ)句分析 如何盜取網(wǎng)站管理權(quán)限

      網(wǎng)站SQL注入語(yǔ)句分析 如何盜取網(wǎng)站管理權(quán)限

      相關(guān)軟件相關(guān)文章發(fā)表評(píng)論 來(lái)源:西西整理時(shí)間:2011/4/17 18:48:05字體大。A-A+

      作者:西西點(diǎn)擊:1777次評(píng)論:0次標(biāo)簽: SQL注入

      Pangolin(SQL注入-滲透測(cè)試工具)v2.5.2.975 綠色多語(yǔ)版
      • 類型:瀏覽安全大小:6.2M語(yǔ)言:多國(guó)語(yǔ)言[中文] 評(píng)分:2.0
      • 標(biāo)簽:
      立即下載

       我們知道網(wǎng)站后臺(tái)需要驗(yàn)證用戶的輸入, 如果不這樣做, 用戶甚至可以輸入一些SQL語(yǔ)句操作后臺(tái)的數(shù)據(jù)庫(kù), 這么好玩的事情一直沒(méi)有真正體驗(yàn)過(guò). 前幾日學(xué)校搞了一個(gè)"你最喜歡的輔導(dǎo)員"投票活動(dòng), 網(wǎng)站估計(jì)是給某個(gè)學(xué)生團(tuán)隊(duì)做的, 結(jié)果經(jīng)同學(xué)破解了這個(gè)網(wǎng)站的管理員帳號(hào)和密碼, 我遂向他請(qǐng)教了原理, 也了解了他破解的步驟, 自己又實(shí)踐了一遍. 感謝經(jīng)同學(xué), 沒(méi)有他我就不知道這些, 也不可能有這篇博客.
              本文破解網(wǎng)站的網(wǎng)址是http://xgc.nuist.edu.cn/vote/vote_login.asp. 可能活動(dòng)過(guò)后, 這個(gè)網(wǎng)址就打不開(kāi)了, 也有可能寫這個(gè)網(wǎng)站的同學(xué)意識(shí)到了漏洞的嚴(yán)重性, 并進(jìn)行了改正, 那么本文的內(nèi)容就不適用于這個(gè)網(wǎng)站了.我整理了詳細(xì)的破解過(guò)程跟大家分享, 文中的邏輯比較強(qiáng), 需要讀者耐心的看.  但文本講述的是破解步驟, 是一般思路, 如果您有疑問(wèn), 請(qǐng)留言, 我們交流討論 :)

      一  網(wǎng)站是否存在SQL注入漏洞

              網(wǎng)站一般包含一張用戶表(用戶名和密碼)和一張管理員信息表(管理員名稱和密碼), 輸入用戶名和密碼之后, 一般做法是后臺(tái)都會(huì)執(zhí)行一條SQL語(yǔ)句, 查詢有沒(méi)有對(duì)應(yīng)的用戶和密碼, 比如SELECT * FROM SomeTable WHERE UserName = '$UserName' AND pwd = '$pwd', 如果這條語(yǔ)句返回真, 那么登錄操作就完成了.
              試想一下如果在學(xué)號(hào)和密碼文本框中輸入'or'='or', 并提交的話, 上面提到的SQL語(yǔ)句就變成了SELECT * FROM SomeTable WHERE UserName = ''or'='or'' AND pwd = ''or'='or'', 這個(gè)語(yǔ)語(yǔ)句變成了一個(gè)邏輯表達(dá)式, 表達(dá)式包含幾段, 分別為:

      1. SELECT * FROM SomeTable WHERE UserName = ''    (假)
      or
      2. '='    (真)
      or
      3. ''    (假)
      and

      4. pwd = ''    (假)
      or
      5. '='    (真)
      or
      6. ''    (假)

              最后整個(gè)邏輯表達(dá)式為0|1|0&0|1|0, 這個(gè)結(jié)果為真(在執(zhí)行到"0|1|..."的時(shí)候整個(gè)表達(dá)式省略號(hào)中的就不計(jì)算了, 因?yàn)?或"前面已經(jīng)是真), 因此可以登錄成功, 事實(shí)上也登錄成功了.

      二  破解后臺(tái)數(shù)據(jù)庫(kù)的原理

              在用戶名和密碼的文本框中輸入'or'='or', 截至上面所示的第2步, 表達(dá)式值為真, 因?yàn)楹竺婢o接了一個(gè)"或", 所以無(wú)論在這后面的表達(dá)式是什么, "真或者假""真或者真"都是為真的. 關(guān)鍵就是'or'='or'中間的那個(gè)'=', '='表示一個(gè)字符, 永遠(yuǎn)為真. 如果我們將這個(gè)'='改成某個(gè)SQL表達(dá)式, 如果這個(gè)表達(dá)式為真, 那么整個(gè)表達(dá)式就為真.
              后面的幾個(gè)步驟要求用戶名和密碼文本框中都輸入同樣的文本, 原因是: 后臺(tái)的語(yǔ)句格式可能是SELECT * FROM SomeTable WHERE UserName = '$UserName' AND pwd = '$pwd', 也有可能是SELECT * FROM SomeTable WHERE pwd = '$pwd' AND UserName = '$UserName', 無(wú)論哪一種情況, 只要用戶名和密碼都輸入的文本是一樣的, 只要文本中包含的SQL表達(dá)式為真, 那么整個(gè)表達(dá)式就為真. 這樣寫帶來(lái)的另一個(gè)好處是復(fù)制粘貼很方便.
              通過(guò)寫一些SQL表達(dá)式來(lái)一次一次的測(cè)試出數(shù)據(jù)庫(kù)里的內(nèi)容.

      三  獲取后臺(tái)數(shù)據(jù)庫(kù)的表名

              如果將表達(dá)式替換為(SELECT COUNT(*) FROM 表名)<>0, 這個(gè)表達(dá)式用來(lái)獲取一個(gè)表中有多少條記錄, 需要做的就是猜這個(gè)表名是什么, 猜中了的話, 那么這個(gè)表中的記錄條數(shù)肯定就不會(huì)等于0, 那么這個(gè)表達(dá)式的值就是真的. 常用的表名也就是那么一些, 一個(gè)個(gè)的代進(jìn)去試, 最后發(fā)現(xiàn)有個(gè)叫做admin的表, 它的字段不為空. 很顯然, 這個(gè)表是用來(lái)存放管理員信息的.

      四  獲取后臺(tái)數(shù)據(jù)庫(kù)表的字段名

              現(xiàn)在已經(jīng)知道這個(gè)表叫做admin了, 接下來(lái)想辦法得到這個(gè)表中的字段.
              把表達(dá)式替換成(SELECT COUNT(*) FROM admin WHERE LEN(字段名)>0)<>0, 這個(gè)表達(dá)式用來(lái)測(cè)試admin這個(gè)表中是否包含這個(gè)字段. LEN(字段名)>0表示這個(gè)字段的長(zhǎng)度大于0, 在這個(gè)字段存在的情況下, LEN(字段名)>0是始終為真的. 如果包含的話這個(gè)字段的話, 整條SELECT語(yǔ)句返回的數(shù)字肯定不為0, 也就是說(shuō)整個(gè)表達(dá)式為真, 從而得到字段名.
              按照這樣的方法, 靠猜共得出了三個(gè)很關(guān)鍵的字段:id, admin, pass.

      五  獲取字段的長(zhǎng)度

              目前已得到的信息是有個(gè)admin表, 表中有id, admin, pass字段. 后臺(tái)中存儲(chǔ)用戶名和密碼, 常規(guī)做法是存儲(chǔ)它們進(jìn)行MD5加密后的值(32位), 現(xiàn)在測(cè)試一下是不是這樣.

              把表達(dá)式替換為(SELECT COUNT(*) FROM admin WHERE LEN(字段名)=32)<>0, 將admin和pass代進(jìn)去結(jié)果是真, 說(shuō)明后臺(tái)存儲(chǔ)管理員帳號(hào)和密碼用的是加密后32位的字段.

      六  獲取管理員帳號(hào)和密碼

              MD5加密后的字符串包含32位, 且只可能是由0-9和A-F這些字符組成.
      1. 獲取管理員帳號(hào)
              將表達(dá)式改成(SELECT COUNT(*) FROM admin WHERE LEFT(admin,1)='A')>0, 意思是我猜測(cè)某個(gè)adimin帳號(hào)的第一個(gè)字符是A, 如果成功則表達(dá)式成立. 失敗的話, 把A換成0-9和B-F中的任意字符繼續(xù)試, 知道成功. 如果成功了, 我再繼續(xù)猜這個(gè)帳號(hào)的第二個(gè)字符, 假如第一個(gè)字符是5, 我猜測(cè)第二個(gè)字符是A, 那將表達(dá)式改成(SELECT COUNT(*) FROM admin WHERE LEFT(admin,2)='5A')>0. 可以發(fā)現(xiàn)字符串中LEFT()函數(shù)中的1變成了2, 另外'5A'代碼左邊兩個(gè)字符是5A, 其中5已經(jīng)確定下來(lái)了. 就這樣重復(fù)不斷的猜, 直到得到整個(gè)32位的MD5加密后的字符串.
      2. 獲取該帳號(hào)對(duì)應(yīng)的的id
              為什么需要獲取該帳號(hào)對(duì)應(yīng)的id? 原因如下: 按照上一條是可以得到帳號(hào)和密碼的, 但一張表中可以有若干個(gè)管理員帳號(hào)和密碼, 怎么對(duì)應(yīng)起來(lái)呢? 需要通過(guò)id. 一個(gè)id對(duì)應(yīng)一條記錄, 一條記錄只有一對(duì)匹配的帳號(hào)和密碼.
              將表達(dá)式改成(SELECT COUNT(*) FROM admin WHERE LEFT(admin,1)='5' AND id=1)>0, 上一條假設(shè)了某帳號(hào)第一個(gè)字符是5, 只要這個(gè)表達(dá)式中的"AND id = 1"正確, 那么就可以得知該帳號(hào)的id是1. 如果不是1, 換成其它的數(shù)字一個(gè)個(gè)的試一試.
      3. 獲取帳號(hào)對(duì)應(yīng)的密碼
              現(xiàn)在已經(jīng)猜出了某管理員的帳號(hào), 并且知道對(duì)應(yīng)的id是多少(假設(shè)得出來(lái)是4), 現(xiàn)在只要得到該條記錄中記錄的密碼是什么. 同理, 將表達(dá)式改成(SELECT COUNT(*) FROM admin WHERE LEFT(pass,1)='A' AND id=4)>0, 注意id已經(jīng)是知道了的4, 現(xiàn)在要一個(gè)個(gè)的猜pass中從第1個(gè)到第32個(gè)字符是什么, 方法同"獲取管理員帳號(hào)"方法. 最后可以得到一個(gè)32位的MD5加密后的字符串(密碼).

      *注: 如果嫌手工得到每個(gè)字符是什么太麻煩, 可以自己用C#寫一個(gè)程序, 模擬一下登錄, 通過(guò)控制一個(gè)循環(huán), 可以很快得到結(jié)果.

      七  將MD5加密后的帳號(hào)和密碼轉(zhuǎn)成明文

              網(wǎng)上有一些網(wǎng)站數(shù)據(jù)庫(kù)里存儲(chǔ)了海量(幾萬(wàn)億條)的MD5加密后的暗文對(duì)應(yīng)的明文, 只需輸入你需要查找的MD5加密后的字符串就可以查看到明文是什么.

      八  尋找網(wǎng)站管理員登錄界面

              如果找不到管理員登錄界面, 就算現(xiàn)在已經(jīng)有了管理員的帳號(hào)和密碼同樣也登錄不了. 針對(duì)這個(gè)網(wǎng)站, 提供給普通學(xué)生登錄的地址是

      http://xgc.nuist.edu.cn/vote/vote_login.asp.

              猜猜也知道管理員的登錄地址很可能是http://xgc.nuist.edu.cn/vote/login.asp, 事實(shí)上就是它.

      九  登錄網(wǎng)站后臺(tái)

      十  總結(jié)

              回頭看看這個(gè)網(wǎng)站安全性...

      如果它在用戶輸入帳號(hào)密碼之后進(jìn)行一下驗(yàn)證, 或許后面的事情就不會(huì)發(fā)生...
      如果數(shù)據(jù)庫(kù)的表名不是這么呆瓜的話, 或許后面的事情就不會(huì)發(fā)生...
      如果數(shù)據(jù)庫(kù)的字段名不是這么呆瓜的話, 或許后面的事情就不會(huì)發(fā)生...
      如果管理員登錄地址不是這么呆瓜的話, 或許后面的事情就不會(huì)發(fā)生...

              如何驗(yàn)證用戶輸入? 最簡(jiǎn)單的方法是過(guò)濾掉用戶輸入的'符號(hào). 除此方法之外, 可以以參數(shù)的方式進(jìn)行數(shù)據(jù)庫(kù)查詢, 如SELECT * FROM SomeTable WHERE UserName = '" & UserName & "' AND pwd = '" & pwd & "', 而不是直接的把用戶輸入的信息直接插入到數(shù)據(jù)庫(kù)查詢語(yǔ)句中. 如果想增加破解難度的話, 還可以在登錄的時(shí)候要求輸入驗(yàn)證碼等等...
              地球太危險(xiǎn)了. 上面寫的都是查詢語(yǔ)句來(lái)獲取想得到的信息, 如果輸入的是一個(gè)DROP TABLE命令, 后果不堪設(shè)想! 以后自己做網(wǎng)站的時(shí)候, 一定要注意這些問(wèn)題.

        相關(guān)評(píng)論

        閱讀本文后您有什么感想? 已有人給出評(píng)價(jià)!

        • 8 喜歡喜歡
        • 3 頂
        • 1 難過(guò)難過(guò)
        • 5 囧
        • 3 圍觀圍觀
        • 2 無(wú)聊無(wú)聊

        熱門評(píng)論

        最新評(píng)論

        第 1 樓 廣西出入境檢驗(yàn)檢疫局(全分局通用) 網(wǎng)友 客人 發(fā)表于: 2013/10/4 1:10:37
        好厲害!

        支持( 0 ) 蓋樓(回復(fù))

        發(fā)表評(píng)論 查看所有評(píng)論(0)

        昵稱:
        表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
        字?jǐn)?shù): 0/500 (您的評(píng)論需要經(jīng)過(guò)審核才能顯示)