PHP代码审计分段讲解(6)

14 intval函数四舍五入

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 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   春告鳥  阅读(329)  评论(0编辑  收藏  举报
编辑推荐:
· 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 让容器管理更轻松!
点击右上角即可分享
微信分享提示