700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 【PHP代码审计实例教程】 那些年一起挖掘SQL注入

【PHP代码审计实例教程】 那些年一起挖掘SQL注入

时间:2021-04-06 17:04:04

相关推荐

【PHP代码审计实例教程】 那些年一起挖掘SQL注入

后端开发|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整理总结,如需转载请联系作者。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。