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编码
此处为什么要有空格
在命令执行的时候,空格是一个非常重要的分隔符,主要用于区分命令的不同组成部分,主要有四种用处
- 分隔命令名称与参数
- 分隔多个参数
- 处理特殊字符的安全性
- 影响某些特定功能的行为
到这个这个页面,我们看到了一个疑似flag的文件,我们去尝试获取文件的所有内容
payload:?url=system(“cat%20/flllllaaaaaaggggggg”);
这样我们就得到了这道题的flag
[SWPUCTF 2021 新生赛]hardrce
首先进行代码审计
if的条件要求是$_COOKIE[‘admin’]是否等于1;我们先尝试着满足条件
此时回显了一个php文件,我们去访问它
首先会看到preg_match()函数用于执行一个正则表达式匹配,搜素字符串与给定模式匹配的内容
这行代码的意思是过滤了空格
再往下看,看到了shell_exec()函数,考虑是命令执行
shell_exec()函数与exec()函数的区别:
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变量
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 |
|
进行代码审计,可以发现代码过滤了一大堆的符号和字母
还有eval语句
对需要使用的函数进行取反,然后进行url编码,之所以使用取反操作,是因为取反操作基本上用的是不可见字符,所以不会触发正则匹配
~进行取反操作,在php种urlencode()函数用于对字符串进行url编码
1 |
|
然后 分别取反,构造payload:?wllm=(%8C%86%8C%8B%9A%92)(%93%8C%DF%D0);
相同的道理将获取文件内容同样取反
1 |
|
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执行
进行代码审计,看eval()函数,考虑命令执行
payload:/?cmd=system(“ls /“);
然后获取文件的内容
payload:/?cmd=system(“cat /flag_1203”);
http协议
使用bp抓包,把请求头改为CTFHUB
cookie
用bp抓包之后,发现了admin=0
0(false)1(true)