后端开发|php教程
【PHP代码审计实例教程】 那些年我们一起挖掘SQL注入 – 4.全局防护Bypass之二次注入
后端开发-php教程
0x01 背景
夏日PHP注册登录源码,vscode相对路径,ubuntu run驱动,tomcat配置需要密码,免费爬虫盘,php网站结构图,seo怎么选择培训班,网站导航开源,货站模板lzw
现在的WEB程序基本都有对SQL注入的全局过滤,像PHP开启了GPC或者在全局文件common.php上使用addslashes()函数对接收的参数进行过滤,尤其是单引号。二次注入也是一种比较常见的注入,它涉及到入库和出库。因为有全局转义所以入库的时候:
淘宝客共享app程序源码,修改时间ubuntu,爬虫软件哪个简单,php $ajax,卫辉seo软文lzw
Insert into table (username) values (‘hack\’’);
邮箱搭建源码,vim修改ubuntu源,tomcat发布到互联网,python爬虫手写,php引用文件中的函数,seo公关发文lzw
这样入库后转义符就会消失变成了hack’,这样如果hack’出库被带入查询的话就会成功的引入了单引号导致注入。
漏洞来源于乌云: /bugs/wooyun--068362
0x02 环境搭建
看背景我们使用了低版本的74cms程序,版本为3.4(0310)
①源码网上可以搜到,我打包了一份: /s/1c1mLCru
②解压到www的74cms(0310)目录下,浏览器访问 http://localhost/74cms(0310) ),然后按照提示一步步安装即可,安装遇到问题请自行百度或谷歌,成功后访问如下图:
0x03 漏洞分析
Part1:源码结构
源码的结构比较清晰,应该是审计过最清晰的结构了,主要有下面三块内容:
index.php引入了common.inc.php文件,我们跟进common.inc.php,发现了处理gpc的函数:
if (!empty($_GET)){$_GET = addslashes_deep($_GET);}if (!empty($_POST)){$_POST = addslashes_deep($_POST);}$_COOKIE = addslashes_deep($_COOKIE);$_REQUEST = addslashes_deep($_REQUEST);
可以看到,服务端处理GET和POST请求的变量时都会做addslashes处理。
Part2:审计过程
1.首先在个人发布简历处:
elseif ($act==make4_save){$resume_education=get_resume_education($_SESSION[uid],$_REQUEST[pid]);if (count($resume_education)>=6) showmsg(教育经历不能超过6条!,1,$link);$setsqlarr[uid]=intval($_SESSION[uid]);$setsqlarr[pid]=intval($_REQUEST[pid]);if ($setsqlarr[uid]==0 || $setsqlarr[pid]==0 ) showmsg(参数错误!,1);$setsqlarr[start]=trim($_POST[start])?$_POST[start]:showmsg(请填写开始时间!,1,$link);$setsqlarr[endtime]=trim($_POST[endtime])?$_POST[endtime]:showmsg(请填写结束时间!,1,$link);$setsqlarr[school]=trim($_POST[school])?$_POST[school]:showmsg(请填写学校名称!,1,$link);$setsqlarr[speciality]=trim($_POST[speciality])?$_POST[speciality]:showmsg(请填写专业名称!,1,$link);$setsqlarr[education]=trim($_POST[education])?$_POST[education]:showmsg(请选择获得学历!,1,$link);$setsqlarr[education_cn]=trim($_POST[education_cn])?$_POST[education_cn]:showmsg(请选择获得学历!,1,$link); //看到这里有个插入表“qs_resume_education”的操作,将教育背景相关的字段入库 if (inserttable(table( esume_education),$setsqlarr)) { check_resume($_SESSION[uid],intval($_REQUEST[pid]));
2.这里看到insert入库了,可以尝试加个单引号,入库后就会消除转义字符。我们先继续跟进inserttables后的check_resume函数
//检查简历的完成程度function check_resume($uid,$pid){global $db,$timestamp,$_CFG;$uid=intval($uid);$pid=intval($pid);$percent=0;$resume_basic=get_resume_basic($uid,$pid);$resume_intention=$resume_basic[intention_jobs];$resume_specialty=$resume_basic[specialty];//获取教育经历,出数据库了$resume_education=get_resume_education($uid,$pid);if (!empty($resume_basic))$percent=$percent+15;if (!empty($resume_intention))$percent=$percent+15;if (!empty($resume_specialty))$percent=$percent+15;if (!empty($resume_education))$percent=$percent+15;if ($resume_basic[photo_img] && $resume_basic[photo_audit]=="1" && $resume_basic[photo_display]=="1"){$setsqlarr[photo]=1;}else{$setsqlarr[photo]=0;}if ($percentextracttag($setsqlarr[key]); $setsqlarr[key]=str_replace(","," ",$resume_basic[intention_jobs])." {$setsqlarr[key]} {$resume_basic[education_cn]}"; $setsqlarr[key]=$sp->pad($setsqlarr[key]); if (!empty($resume_education)) { //遍历教育经历所有字段,加入到数组里 foreach($resume_education as $li) { $setsqlarr[key]="{$li[school]} {$setsqlarr[key]} {$li[speciality]}"; } } $setsqlarr[ efreshtime]=$timestamp;}//这里对教育经历做了次更新操作,二次注入由此产生!updatetable(table( esume),$setsqlarr,"uid={$uid} AND");updatetable(table( esume_tmp),$setsqlarr,"uid={$uid} AND");
3.我们填写一份简历简单试验下,在教育经历处学校名称字段填写aa’
保存后发现报错语句:
0x04 漏洞证明
构造获取数据库用户相关信息的POC:
查看简历发现简历姓名变成了root@localhost:
查看sql语句发现更新语句是成功执行的:
最后,有兴趣的同学可以继续获取其它的管理员账户等相关字段的信息。
本文由HackBraid整理总结,如需转载请联系作者。