审计一套CMS中的SQL注入
漏洞分为系统漏洞和应用漏洞,系统漏洞以二进制漏洞为代表,其挖掘难度较高需要对反汇编和操作系统原理深入理解,而除了系统漏洞以外还有一些应用漏洞,包括不限MySQL,Apache,为代表的Web漏洞,这里我们就挖掘PHP代码层面的漏洞。
漏洞的挖掘也分为,点对点挖掘漏洞,和分散式挖掘漏洞,这我们主要使用点对点挖掘,在挖掘是我们需要找一些关键字,漏洞本身就是两个条件,可控的函数,和可控的变量。
1.首先打开about.php源代码,然后 $GET[r] 通过GET的方式接收一个传递参数,然后通过使用 addslashes 函数过滤,addslashes函数的作用是转义,将多余的单引号全部转义,转义以后交给llink变量保存结果,然后拼接SQL查询语句,由于拼接代码 $llink中存在单引号,那我们需要手动闭合单引号,一旦闭合单引号addslashes函数就起了作用,会自动过滤掉单引号,所以这里无法被绕过。
1 2 3 4 5 6 7 8 9 10 11 | <?php require 'inc/conn.php' ; require 'inc/time.class.php' ; $query = "SELECT * FROM settings" ; $resul = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $info = mysql_fetch_array( $resul ); $llink = addslashes ( $_GET [ 'r' ]); $query = "SELECT * FROM nav WHERE link='$llink'" ; $resul = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $navs = mysql_fetch_array( $resul ); ?> |
2.打开另一个 content.php 观察下方的PHP代码,虽然有很多处数据库的操作,但是带入查询时都是通过单引号括起来的,并且每一个语句都强制使用addslashes函数进行了不同程度的转义,这里并没有可利用的地方。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php require 'inc/conn.php' ; require 'inc/time.class.php' ; $query = "SELECT * FROM settings" ; $resul = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $info = mysql_fetch_array( $resul ); $id = addslashes ( $_GET [ 'cid' ]); $query = "SELECT * FROM content WHERE id='$id'" ; $resul = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $content = mysql_fetch_array( $resul ); $navid = $content [ 'navclass' ]; $query = "SELECT * FROM navclass WHERE id='$navid'" ; $resul = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $navs = mysql_fetch_array( $resul ); //浏览计数 $query = "UPDATE content SET hit = hit+1 WHERE id=$id" ; @mysql_query( $query ) or die ( '修改错误:' .mysql_error()); ?> <?php $query =mysql_query( "select * FROM interaction WHERE (cid='$id' AND type=1 and xs=1)" ); $pinglunzs = mysql_num_rows( $query ) ?> |
3.打开 submit.php 文件,观察代码发现这里作者写遗漏了,这里并没有过滤函数的过滤,而且都是POST方式传递的参数,明显可以使用POST注入。
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php session_start(); require 'inc/conn.php' ; $type = addslashes ( $_GET [ 'type' ]); $name = $_POST [ 'name' ]; $mail = $_POST [ 'mail' ]; $url = $_POST [ 'url' ]; $content = $_POST [ 'content' ]; $cid = $_POST [ 'cid' ]; $ip = $_SERVER [ "REMOTE_ADDR" ]; $tz = $_POST [ 'tz' ]; if ( $tz == "" ){ $tz =0;} $jz = $_POST [ 'jz' ]; |
将代码向下翻,可以看到 SELECT * FROM interaction WHERE( mail = '$mail') 这么一条查询语句,这条语句虽然 $mail 参数被加了单引号,但是由于没有进行有效的过滤,所以我们可以通过构建一些SQL语句巧妙地闭合它。
1 2 3 4 5 6 7 8 9 | //查询用户头像数据 $query = "SELECT * FROM interaction WHERE( mail = '$mail')" ; $result = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $tx = mysql_fetch_array( $result ); if (!mysql_num_rows( $result )){ $touxiang = mt_rand(1,100); } else { $touxiang = $tx [ 'touxiang' ]; } |
继续向下找,同样的在最下方也发现了存在查询语句 SELECT * FROM download WHERE( id= $cid) 这个cid参数,也没有进行合法化的检查,也是一个SQL注入漏洞。
1 2 3 4 5 6 | if ( $type ==3){ $query = "SELECT * FROM download WHERE( id= $cid)" ; $result = mysql_query( $query ) or die ( 'SQL语句有误:' .mysql_error()); $wz = mysql_fetch_array( $result ); $title = $wz [ 'title' ]; $body ='<div style= "border:1px double #06f;" > |
上方两处就是这个CMS系统的注入漏洞,虽然mail参数上有单引号,但是并没有检查合法化,这里我们只需要将其闭合掉就可以。
这两个变量我们能够操作他,因为它带入到数据库查询了,我们只需要把前面的单引号闭合掉。
4.上方的漏洞文件在 /files/submit.php,且文件的开头都是 $_POST['xxx']; 明显这是POST注入,这里如果直接使用 http://127.0.0.1/cms/files/submit.php 访问的话会报错,原因是包含不到 require 'inc/conn.php'; 这个文件,我们继续看下主 index.php 是怎么包含的,如下代码:
1 2 3 4 5 6 | <?php error_reporting (0); //关闭错误显示 $file = addslashes ( $_GET [ 'r' ]); //接收文件名 $action = $file == '' ? 'index' : $file ; //判断为空或者等于index include ( 'files/' . $action . '.php' ); //载入相应文件 ?> |
如上:首先通过 $_GET['r] 接收一个参数,然后传递给file,action 如果为空则等于index,最终包含 files/.action.php,如果要访问 /files/submit.php 包含以后的写法是:?r=submit 或者完整写法 /index.php?r=submit
5.为了方便演示,我们在 submit.php 文件中加入以行打印函数,echo $mail; 打印出mail里面的参数
1 2 3 4 5 6 7 8 | <?php session_start(); require 'inc/conn.php' ; $type = addslashes ( $_GET [ 'type' ]); $name = $_POST [ 'name' ]; $mail = $_POST [ 'mail' ]; echo $mail ; < ------------------------ $url = $_POST [ 'url' ]; |
然后使用火狐浏览器的hackBar插件进行POST注入,如下图注入成功了。
除此之外,login.php 文件中也存在一个注入漏洞 /cms/admin/?r=login ,我们可以直接写出他的exp ,但是这里没有地方可以完成回显,但漏洞是存在的。
直接记下 http://127.0.0.1/cms/admin/?r=login 网址然后,我们打开SQLMAP跑一下。
本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?