PHP代码审计分段讲解(6)
14 intval函数四舍五入
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 "no! try again
";
}
else{
echo($query[content]);
}
}
?>
使用GET方式传入id,连接数据库
使用 intval 函数获取变量id的整数值。
这里没有题目背景不是很清楚,但是看上去好像是需要传入的id不等于1024,但是数据库中需要查询出id=1024的值。
所以我们只需要输入一个小数即可,intval自动将其转换成整数,数据库正确查询,而又令
$_GET[id]==1024
不成立,输出查询结果。
15 strpos数组绕过NULL与ereg正则%00截断
$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 的值,变量数字判断
@ereg ("^[1-9]+$", $_GET['nctf']) === FALSE
如果全部是数字,还需要里面包含有字符串:#biubiubiu,输出flag
strpos ($_GET['nctf'], '#biubiubiu') !== FALSE
这个题目可以通过输入数组进行绕过获取flag,但我们使用截断的方式
首先nctf全部是数字是很容易满足的,在之前的题目中我们又了解到ereg函数是存在%00截断的,所以我们最终的payload为:
?nctf=123%00%23biubiubiu
注意#需要进行URL编码
16 SQL注入or绕过
#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函数
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查询语句
$query='SELECT * FROM users WHERE name=\''.$username.'\' AND pass=\''.$password.'\';';
可以看出来,这里是典型的万能密码登录语句,我们根据语句进行构造
?username=admin\'\' AND pass=\''or 1 #&password=
将语句进行相应的闭合即可登录