漏洞审计策略(数据流) |
PHP版本要求:无
系统要求:无
审计策略:查找字符HTTP_RAW_POST_DATA或者php://input |
4) 数据库操作容易忘记'的地方如:in()/limit/order by/group by
如Discuz!<5.0的pm.php:
if(is_array($msgtobuddys)) { $msgto = array_merge($msgtobuddys, array($msgtoid)); ...... foreach($msgto as $uid) { $uids .= $comma.$uid; $comma = ','; } ...... $query = $db->query("SELECT m.username, mf.ignorepm FROM {$tablepre}members m LEFT JOIN {$tablepre}memberfields mf USING(uid) WHERE m.uid IN ($uids)");
漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:查找数据库操作字符(select,update,insert等等) |
变量的编码与解码
一个WEB程序很多功能的实现都需要变量的编码解码,而且就在这一转一解的传递过程中就悄悄的绕过你的过滤的安全防线。
这个类型的主要函数有:
1) stripslashes() 这个其实就是一个decode-addslashes()
2) 其他字符串转换函数:
base64_decode |
对使用 MIME base64 编码的数据进行解码 |
base64_encode |
使用 MIME base64 对数据进行编码 |
rawurldecode |
对已编码的 URL 字符串进行解码 |
rawurlencode |
按照 RFC 1738 对 URL 进行编码 |
urldecode |
解码已编码的 URL 字符串 |
urlencode |
编码 URL 字符串 |
... |
... |
另外一个 unserialize/serialize
3) 字符集函数(GKB,UTF7/8...)如iconv()/mb_convert_encoding()等
目前很多漏洞挖掘者开始注意这一类型的漏洞了,如典型的urldecode:
$sql = "SELECT * FROM article WHERE articleid='".urldecode($_GET[id])."'";
当magic_quotes_gpc=on时,我们提交?id=%2527,得到sql语句为:
SELECT * FROM article WHERE articleid='''
漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:查找对应的编码函数 |
二次攻击
详细见附录[1]
1)数据库出来的变量没有进行过滤
2)数据库的转义符号:
- mysql/oracle转义符号同样是\(我们提交'通过魔术引号变化为\',当我们update进入数据库时,通过转义变为')
- mssql的转义字符为'(所以我们提交'通过魔术引号变化为\',mssql会把它当为一个字符串直接处理,所以魔术引号对于mssql的注射没有任何意义)
从这里我们可以思考得到一个结论:一切进入函数的变量都是有害的,另外利用二次攻击我们可以实现一个webrootkit,把我们的恶意构造直接放到数据库里。我们应当把这样的代码看成一个vul?
漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:通读代码 |
魔术引号带来的新的安全问题
首先我们看下魔术引号的处理机制:
[\-->\\,'-->\',"-->\",null-->\0]
这给我们引进了一个非常有用的符号“\”,“\”符号不仅仅是转义符号,在WIN系统下也是目录转跳的符号。这个特点可能导致php应用程序里产生非常有意思的漏洞:
1)得到原字符(',\,",null])
$order_sn=substr($_GET['order_sn'], 1);
//提交 ' //魔术引号处理 \' //substr '
$sql = "SELECT order_id, order_status, shipping_status, pay_status, ". " shipping_time, shipping_id, invoice_no, user_id ". " FROM " . $ecs->table('order_info'). " WHERE order_sn = '$order_sn' LIMIT 1";
2)得到“\”字符
$order_sn=substr($_GET['order_sn'], 0,1);
//提交 ' //魔术引号处理 \' //substr \
$sql = "SELECT order_id, order_status, shipping_status, pay_status, ". " shipping_time, shipping_id, invoice_no, user_id ". " FROM " . $ecs->table('order_info'). " WHERE order_sn = '$order_sn' and order_tn='".$_GET['order_tn']."'";
提交内容:
?order_sn='&order_tn=%20and%201=1/*
执行的SQL语句为:
SELECT order_id, order_status, shipping_status, pay_status, shipping_time, shipping_id, invoice_no, user_id FROM order_info WHERE order_sn = '\' and order_tn=' and 1=1/*'
漏洞审计策略 |
PHP版本要求:无
系统要求:无
审计策略:查找字符串处理函数如substr或者通读代码 |
变量key与魔术引号
我们最在这一节的开头就提到了变量key,PHP的魔术引号对它有什么影响呢?
<?php //key.php?aaaa'aaa=1&bb'b=2 //print_R($_GET); foreach ($_GET AS $key => $value) { print $key."\n"; } ?>
1)当magic_quotes_gpc = On时,在php5.24下测试显示:
aaaa\'aaa bb\'b
从上面结果可以看出来,在设置了magic_quotes_gpc = On下,变量key受魔术引号影响。但是在php4和php<5.2.1的版本中,不处理数组第一维变量的key,测试代码如下:
<?php //key.php?aaaa'aaa[bb']=1 print_R($_GET); ?>
结果显示:
Array ( [aaaa'aaa] => Array ( [bb\'] => 1 ) )
数组第一维变量的key不受魔术引号的影响。
(责任编辑:最模板) |