for($i=0;$i
{
$str=$str."/";
$resp=file_get_contents('http://127.0.0.1/test/index.php?action=1.txt'.$str);
//1.txt里的代码为print 'hi';
if (strpos($resp, 'hi') !== false)
{
print $i;
exit;
}
}
?>
复制代码
经过测试字符"."、"/"或者2个字符的组合,在一定的长度时将被截断,win系统和*nix的系统长度不一样,当win下strlen(realpath("./"))+strlen($_GET['action'])的长度大于256时被截断,对于*nix的长度是4 * 1024 = 4096。对于php.ini里设置远程文件关闭的时候就可以利用上面的技巧包含本地文件了
0x3: 数据截断
对于很多web应用文件在很多功能是不容许重复数据的,比如用户注册功能等。一般的应用程序对于提交注册的username和数据库里已有的username对比是不是已经有重复数据,然而我们可以通过“数据截断”等来饶过这些判断,数据库在处理时候产生截断导致插入重复数据。
复制代码
1) Mysql SQL Column Truncation Vulnerabilities
这个是由于mysql的sql_mode设置为default的时候,即没有开启STRICT_ALL_TABLES选项时,MySQL对于插入超长的值只会提示warning,而不是error(如果是error就插入不成功),这样可能会导致一些截断问题。测试如下:
mysql> insert into truncated_test(`username`,`password`) values("admin","pass");
mysql> insert into truncated_test(`username`,`password`) values("admin x", "new_pass");
Query OK, 1 row affected, 1 warning (0.01 sec)
mysql> select * from truncated_test;
+----+------------+----------+
| id | username | password |
+----+------------+----------+
| 1 | admin | pass |
| 2 | admin | new_pass |
+----+------------+----------+
2 rows in set (0.00 sec)
2) Mysql charset Truncation vulnerability
当mysql进行数据存储处理utf8等数据时对某些字符导致数据截断。测试如下:
mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from truncated_test;
+----+------------+----------+
| id | username | password |
+----+------------+----------+
| 1 | admin | pass |
| 2 | admin | new_pass |
| 3 | admin | new_pass2 |
+----+------------+----------+
2 rows in set (0.00 sec)
很多的web应用程序没有考虑到这些问题,只是在数据存储前简单查询数据是否包含相同数据,如下代码:
$result = mysql_query("SELECT * from test_user where user='$user' ");
....
if(@mysql_fetch_array($result, MYSQL_NUM))
{
die("already exist");
}
复制代码
这两种漏洞都有可能导致账户重复注册、管理员帐号提权等漏洞。
0x4: 文件操作里的特殊字符
文件操作里有很多特殊的字符,发挥特别的作用,很多web应用程序没有注意处理这些字符而导致安全问题。比如很多人都知道的windows系统文件名对"空格"和"."等的忽视,这个主要体现在上传文件或者写文件上,导致直接写webshell。另外对于windows系统对".\..\"进行系统转跳等等。例如:
复制代码
..
//Is this code vul?
if( eregi(".php",$url) )
{
die("ERR");
}
$fileurl=str_replace($webdb[www_url],"",$url);
.....
header('Content-Disposition: attachment; filename='.$filename);
复制代码
很多人看出来了上面的代码的问题,程序首先禁止使用".php"后缀。但是下面居然接了个str_replace替换webdbwwwurl为空,那么我们提交".pwebdbwww_urlhp"就可以饶过了。那么上面的代码杂fix呢?有人给出了如下代码:
复制代码
..
$fileurl=str_replace($webdb[www_url],"",$url);
if( eregi(".php",$url) )
{
die("ERR");
}
复制代码
str_replace提到前面了,很完美的解决了str_replace代码的安全问题,但是问题不是那么简单,上面的代码在某些系统上一样可以突破。接下来我们先看看下面的代码:
复制代码
for($i=0;$i
{
$url = 'index.ph'.chr($i);
$tmp = @file_get_contents($url);
if(!empty($tmp)) echo chr($i)."\r\n";
}
?>
ok
复制代码
我们在windows系统运行上面的代码得到如下字符
1.
2. >
3. P
4. p
都可以打开目录下的index.php。这可以被作为一个文件后缀名绕过的思路。
6. 怎么进一步寻找新的字典
上面我们列举很多的字典,但是很多都是已经公开过的漏洞或者方式,那么我们怎么进一步找到新的字典或者利用方式呢?
1. 分析和学习别人发现的漏洞或者exp,总结出漏洞类型及字典
2. 通过学习php手册或者官方文档,挖掘出新的有危害的函数或者利用方式
3. fuzz php的函数,找到新的有问题的函数(不一定非要溢出的),有很多问题都可以简单的fuzz脚本可以测试出来
4. 分析php源代码,发现新的漏洞函数"特性"或者漏洞,如果你要进一步找到新的字典,可以在php源代码的基础上分析下成因,然后根据这个成因来分析寻找新的漏洞函数"特性"或者漏洞。
5. 有条件或者机会和开发者学习,找到他们实现某些常用功能的代码的缺陷或者容易忽视的问
http://www.bkjia.com/PHPjc/815134.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/815134.htmlTechArticle目录 复制代码 1. 前言 2. 传统的代码审计技术 3. PHP版本与应用代码审计 4. 其他的因素与应用代码审计 5. 扩展我们的字典 5.1 变量本身的ke...