第十一章:过滤逻辑错误审计
2019-07-24 21:51:49 Author: mp.weixin.qq.com(查看原文) 阅读量:56 收藏

本文审计的系统为云ec电商系统版本1.2.3,网上也有审计文章这里主要是讲讲,有些程序可能本身他的过滤代码还是比较不错,但是逻辑问题造成了过滤函数没有起作用。

还是先从index.php文件看进去吧!

  1. <?php

  2. define('in_mx', TRUE);

  3. $ym_version='1.2.3';

  4. $p=isset($_GET['p']) ? addslashes($_GET['p']) : '';

  5. $p=(trim($p)=='') ? 'index' : trim($p);

  6. require("./inc/function/global.php");

  7. switch ($p){

  8. case 'admin':

  9. include("./inc/function/global_admin".Ext);

  10. exit();

  11. break;

  12. case 'install':

  13. require("./install/index".Ext);

  14. exit();

  15. break;

  16. default:

  17. if(strpos($p, "n-")===0 || $ym_url_path[0] === 'news'){

  18. include("./inc/function/global_news".Ext);

  19. }

  20. else{

  21. include("./inc/function/global_page".Ext);

  22. }

  23. break;

  24. }

  25. ?>

从index.php来看是GET获取P参数然后引用对应的文件,先来看看/inc/function/global.php

  1. set_error_handler("customError",E_ERROR);

  2. $getfilter="\\b(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

  3. $postfilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

  4. $cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";

  5. function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){

  6. if(is_array($StrFiltValue))

  7. {

  8. $StrFiltValue=implode($StrFiltValue);

  9. }

  10. if (preg_match("/".$ArrFiltReq."/is",urldecode($StrFiltValue))){

  11. print "网址有误~";

  12. exit();

  13. }

  14. }

  15. foreach($_GET as $key=>$value){

  16. StopAttack($key,$value,$getfilter);

  17. }

  18. if ($_GET["p"]!=='admin'){

  19. foreach($_POST as $key=>$value){

  20. StopAttack($key,$value,$postfilter);

  21. }

  22. }

  23. foreach($_COOKIE as $key=>$value){

  24. StopAttack($key,$value,$cookiefilter);

  25. }

  26. unset($_GET['_SESSION']);

  27. unset($_POST['_SESSION']);

  28. unset($_COOKIE['_SESSION']);

这个正则貌似就是copy的360webscan的那个,这里GET、POST、COOKIE都被过滤了的,但是我们看到其中过滤POST的判断

  1. if ($_GET["p"]!=='admin'){

  2. foreach($_POST as $key=>$value){

  3. StopAttack($key,$value,$postfilter);

  4. }

  5. }

如果GET传入的p=admin了就不会进入这个if语句,也达到我们绕过的目的了,然后往下面看

  1. if (!empty($_GET)){ foreach($_GET AS $key => $value) $$key = addslashes_yec($value); }

  2. if (!empty($_POST)){ foreach($_POST AS $key => $value) $$key = addslashes_yec($value); }

这里我们传入的P参数的值被重新覆盖掉,然后经过 addslashes_yec函数过滤。然后我们梳理一下审计思路

  1. 1. 寻找SERVER获取的。

  2. 2. 寻找数字型注入,结合上面的绕过,注入密码。

先看看前台注入,这个cms注入比较多,我就随便写个了

\inc\module\cart.php

  1. elseif ($act == 'remove_goods') //移除商品

  2. {

  3. $ckey = $ckey ? intval($ckey) : intval($_COOKIE['ckey']);

  4. $gid_list = explode("@", $gid);

  5. $spec_list = explode("@", $spec);

  6. $db = dbc();

  7. $where ='';

  8. if($ckey != 0)

  9. {

  10. $where =' and cid='.$ckey;

  11. }

  12. elseif($ym_uid !=0)

  13. {

  14. $where =' and uid='.$ym_uid;

  15. }

  16. else {

  17. $res['err'] = '请刷新页面再试';

  18. die(json_encode_yec($res));

  19. }

  20. foreach ($gid_list as $k => $v) {

  21. $sp = $spec_list[$k];

  22. if(intval($v)<=0)

  23. {

  24. continue;

  25. }

  26. $db->query("delete i FROM ".$db->table('cart')." c join ".$db->table('cart_item')." i on c.id=i.cid where gid=".$v." and spec='".$sp."' ".$where);

  27. }

  28. $cnum = get_cart_amount(1);

  29. $res['res'] = $cnum;

  30. $time = time() + 15552000;

  31. set_cookie('cnum', $cnum, $time); //购物车数量

  32. die(json_encode_yec($res));

  33. }

其中传入的$gid经过 explode函数分割(这里sql语句中不能使用@字符),然后foreach循环取出来后带入sql语句,也没有单双引号之类的包裹,比较明显的一处注入了。

如果没用绕过是会触发360webscan的

这套程序在1.2.4这里修复了这个逻辑方面的问题貌似漏洞就没啥了。本版本还有很多注入大家可以自己审计一下,也可以看看水泡泡巨佬的https://www.cnblogs.com/r00tuser/p/9014869.html


文章来源: https://mp.weixin.qq.com/s/NlADpDfx4CfCF6iUCU3Y5w
如有侵权请联系:admin#unsafe.sh