PHP代码审计分段讲解(6)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?php if ( $_GET [id]) { mysql_connect(SAE_MYSQL_HOST_M . ':' . SAE_MYSQL_PORT,SAE_MYSQL_USER,SAE_MYSQL_PASS); mysql_select_db(SAE_MYSQL_DB); $id = intval ( $_GET [id]); $query = @mysql_fetch_array(mysql_query( "select content from ctf2 where id='$id'" )); if ( $_GET [id]==1024) { echo "<p>no! try again</p>" ; } else { echo ( $query [content]); } } ?> |
使用GET方式传入id,连接数据库
使用 intval 函数获取变量id的整数值。
这里没有题目背景不是很清楚,但是看上去好像是需要传入的id不等于1024,但是数据库中需要查询出id=1024的值。
所以我们只需要输入一个小数即可,intval自动将其转换成整数,数据库正确查询,而又令
1 | $_GET [id]==1024 |
不成立,输出查询结果。
15 strpos数组绕过NULL与ereg正则%00截断
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php $flag = "flag" ; if (isset ( $_GET [ 'nctf' ])) { if (@ ereg ( "^[1-9]+$" , $_GET [ 'nctf' ]) === FALSE) echo '必须输入数字才行' ; else if ( strpos ( $_GET [ 'nctf' ], '#biubiubiu' ) !== FALSE) die ( 'Flag: ' . $flag ); else echo '骚年,继续努力吧啊~' ; } ?> |
使用GET方式传入 nctf 的值,变量数字判断
1 | @ ereg ( "^[1-9]+$" , $_GET [ 'nctf' ]) === FALSE |
如果全部是数字,还需要里面包含有字符串:#biubiubiu,输出flag
1 | strpos ( $_GET [ 'nctf' ], '#biubiubiu' ) !== FALSE |
这个题目可以通过输入数组进行绕过获取flag,但我们使用截断的方式
首先nctf全部是数字是很容易满足的,在之前的题目中我们又了解到ereg函数是存在%00截断的,所以我们最终的payload为:
1 | ?nctf=123%00%23biubiubiu |
注意#需要进行URL编码
16 SQL注入or绕过
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 26 27 | <?php #GOAL: login as admin,then get the flag; error_reporting (0); require 'db.inc.php' ; function clean( $str ){ if (get_magic_quotes_gpc()){ //get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置 $str = stripslashes ( $str ); //返回一个去除转义反斜线后的字符串(\' 转换为 ' 等等)。双反斜线(\\)被转换为单个反斜线(\)。 } return htmlentities( $str , ENT_QUOTES); } $username = @clean((string) $_GET [ 'username' ]); $password = @clean((string) $_GET [ 'password' ]); //$query='SELECT * FROM users WHERE name=\''admin\'\' AND pass=\''or 1 #'\';'; $query = 'SELECT * FROM users WHERE name=\'' . $username . '\' AND pass=\'' . $password . '\';' ; $result =mysql_query( $query ); if (! $result || mysql_num_rows( $result ) < 1){ die ( 'Invalid password!' ); } echo $flag ; ?> |
使用GET方式传入 username 和 password,将其使用函数clean清理,查看clean函数
1 2 3 4 5 6 | function clean( $str ){ if (get_magic_quotes_gpc()){ //get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置 $str = stripslashes ( $str ); //返回一个去除转义反斜线后的字符串(\' 转换为 ' 等等)。双反斜线(\\)被转换为单个反斜线(\)。 } return htmlentities( $str , ENT_QUOTES); } |
可以看到,如果本地系统开启了GPC的话,将会使用stripslashes返回一个去除转义反斜线后的字符串。
关于GPC
开启magic_quotes_gpc=on之后,能实现addslshes()和stripslashes()这两个函数的功能。在PHP4.0及以上的版本中,该选项默认情况下是开启的,所以在PHP4.0及以上的版本中,就算PHP程序中的参数没有进行过滤,PHP系统也会对每一个通过GET、POST、COOKIE方式传递的变量自动转换,换句话说,输入的注入攻击代码将会全部被转换,将给攻击者带来非常大的困难。
也就是说,当本地系统开启了GPC的时候,为了让我们也能过通过这道题,作者使用clean函数去除掉了开启GPC之后的效果
接着是SQL查询语句
1 | $query = 'SELECT * FROM users WHERE name=\'' . $username . '\' AND pass=\'' . $password . '\';' ; |
可以看出来,这里是典型的万能密码登录语句,我们根据语句进行构造
1 | ?username=admin\ '\' AND pass=\'' or 1 #&password= |
__EOF__

本文链接:https://www.cnblogs.com/Cl0ud/p/13260318.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 让容器管理更轻松!