SUCTF的部分web题
0x00
大佬在群里分享的一次外校的招新ctf赛,没什么经验,第一次个人参加,做出了几题,虽然挺开心的。但是还是有挺多题目做不出来。(萌新瑟瑟发抖...)
0x01
include me
题目给的提示是index,但是打开以后的界面是这样的
结合题目,猜测是通过include函数去包含不同的php文件,这时想到通过php伪协议去读取index页面的源码
构造payload:
php://filter/read=convert.base64-encode/resource=index.php
通过burp抓包以后修改请求得到了返回了一段base64的字符串.
解码以后得到了index.php的源码:
<?php
if(isset($_GET["lang"])){
$lang=$_GET["lang"];
}else{
$lang="cn.php";
}
?>
<form>
<select style="width:60px;" name="lang">
<option value="cn.php"<?php echo $lang=="cn.php"?"selected":"";?>>Chinese</option>
<option value="en.php"<?php echo $lang=="en.php"?"selected":"";?>>English</option>
<option value="kr.php"<?php echo $lang=="kr.php"?"selected":"";?>>
Korean</option>
<option value="jp.php"<?php echo $lang=="jp.php"?"selected":"";?>>Japanese</option>
<option value="de.php"<?php echo $lang=="de.php"?"selected":"";?>>German</option>
<option value="fr.php"<?php echo $lang=="fr.php"?"selected":"";?>>French</option>
<input type="submit" value="change language">
</form>
<?php
$flag="SUCTF{ha_ha_ha_you_win}";
include $lang;
?>
一下就看到flag了。这道题也是相对简单的,考察的是关于文件包含漏洞的相关知识,而php有一些内置协议file://、php://、 data://等等可以做到更多的事情。
onepiece
作为海贼迷,我也相信onepiece是真的存在的,所以刚看到题目的时候我就想着一定要做出来,结果到最后都没做出来, o(╥﹏╥)o
题目提示用了phpstorm,然后搜索了一下发现在phpstrom下面建项目是会建立.idea这个目录的,所以直接输入目录看到了下面的3个文件,一个个点开终于在第三个文件中发现了东西。
仔细看了整个文件发现了这个项目还有另外的3个页面,然后呢第一个UpL0ad.php页面一开始不停上传一句话木马都没反应就放弃了
后来打开了README.html,看到了接下来的提示
根据提示,把onepiece.zip文件下载下来后得到一个php文件
<?php
if (!defined("BEBCEFCCAC")){define("BEBCEFCCAC", __FILE__);global $?$垟,$剶?$崒憢,$湊灋?$€搰殎?$帨櫀煍?$挐焾啌帥,$棞垑噭殕?$妵槗仜寫梾,$垨洊墭晸焾?$泙瀮媶墕崕挅,$唴檪搳殮搼晧?$?帊墤墛弽棖槦,$剢憸帢晳媭媴敐?$煓墴垬垰仈姁寔垕;function 暊($暊,$垟?""){global $?$垟,$剶?$崒憢,$湊灋?$€搰殎?$帨櫀煍?$....
打开这个php看到一串的乱码,整个人都傻了,后来查到这是经过了php混淆加密以后的文件,接下来就是去找解密的方法,一开始找到某个大佬的解密方法(http://sec2hack.com/web/phpjiami-decode.html),但是自己跟着弄了几次都不行就放弃了....看来onepiece是看不到了。后来比赛方放出writeup的时候
跟着用了上面的解密网站一下就解密了文件...想当时我用其他网站解密的时候各种问题,而且还要收费,虽然我没花钱...
classic sql
这题一开始弄到手也不知道怎么做,因为发现黑名单过滤了很多常用的字符串,于是就一直搜,搜到了一题基本一样的题目(https://github.com/hongriSec/PHP-Audit-Labs/blob/master/PHP-Audit-Labs%E9%A2%98%E8%A7%A3/Day13-16/files/README.md),是红日安全-代码审计小组的一道题目。
这题的思路是
详细的解释就是:
通过\去转义user的一个单引号,使得user的值变成了
\' and pwd =
然后后面
||
实际上就是or的意思
另外REGEXP函数也有一些语法规则可以匹配特定的字符串,可自行搜索了解
xss1
这道题是关于xss的,根据js脚本可以看到只要输入alert就会被替换,那要做的就是把alert用其他方法表示出来。官方的writeup是根据jsfuck来做的,而我不是:
将alert字符串通过parseInt方法转成一个整数,然后把这个整数再通过toString方法转回alert,这样payload就是
eval((8680439).toString(30))(1)
就没有alert这个字符串.但是这题还有一点要注意的是我们输入的字符串被两个双引号包围了,如果直接输入payload也不能实现弹窗
在控制台可以看到字符串被包围了,那这时就需要逃脱双引号,我们可以使用
" + "
前后两个双引号分别闭合原先代码中的双引号,这时payload就变成了
"+eval((8660439).toString(30))(1)+"
php is No.1
这题主要是关于php的弱等于的知识.
这是官方的writeup,这里说的is_numeric我还真不知道,不过我是用科学计数的表示去做的,
我的payload是:
time=3.888e6 & num=0e1
首先这两个都是整数能通过is_numeric函数,这时进入到最里面的if-elseif-else语句,而要让通过计算可以得到3.888*10^6是介于题目要求的两个数之间,然后php中把一个变量强制转换成int的时候,遇到字母就会截断,例如
$ a = '123a.0123'
$ b = (int) $a ; //实际上b会等于123
那么这时我们大概等待4s就可以得到flag了。
0x10
这次实际上没做出什么题目,但是挺开心,毕竟开始能看懂和自己弄懂一些题目了。另外这次比赛还有几题比较难的,还没有复现成功,鉴于题目要关掉了,还没时间做,暂时就弄到这里吧。