本文已参与 「新人创作礼」 活动,一起开启掘金创作之路。
题目给到源码
<?php
$ip = isset($_POST['ip'])?$_POST['ip']:die();
if(!preg_match('/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/i',$ip)){
die("ip 格式错误!");
}
echo strlen($ip);
if(strlen($ip)<7||strlen($ip)>21){
die("ip 长度错误!");
}
// D e t e r m i n e O S a n d e x e c u t e t h e p i n g c o m m a n d.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// W i n d o w s
$cmd = shell_exec( 'ping ' .$ip );
}else {
// * n i x
$cmd = shell_exec( 'ping -c 1 ' .$ip );
}
// F e e d b a c k f o r t h e e n d u s e r
echo "<pre>{$cmd}</pre>";
## 要 求 , 利 用 命 令 执 行 g e t s h e l l
正则匹配的时候,仅仅匹配了点旁边的1-3位数字,且为限定&结束匹配字符串
因此只要构造一个以正常形式 ip 开头的参数即可
然后在这个正常的 ip 之后利用管道或者逻辑运算就可以执行任意命令
payload:
ip=1.1.1.1 || ls
得到flag文件名,直接访问即可。
管道符: 1.& Usage:第一条命令 & 第二条命令 [& 第三条命令...] 用这种方法可以同时执行多条命令,而不管命令是否执行成功 2.&& Usage:第一条命令 && 第二条命令 [&& 第三条命令...] 用这种方法可以同时执行多条命令,当碰到执行出错的命令后将不执行后面的命令,如果一直没有出错则一直执行完所有命令; 3.|| Usage:第一条命令 || 第二条命令 [|| 第三条命令...] 用这种方法可以同时执行多条命令,当碰到执行正确的命令后将不执行后面的命令,如果没有出现正确的命令则一直执行完所有命令; 4.| Usage:第一条命令 | 第二条命令 [| 第三条命令...] 将第一条命令的结果作为第二条命令的参数来使用,记得在unix中这种方式很常见。