php.ini 配置引发的问题

    在学 SQL 注入的时候,自己写了个 php 文件做测试,结果就出现单引号被转义的事情,导致无法产生单引号报错。
    初探 sqli-labs-master 靶机的时候(还是在第一关)又出现这个问题。。。
    是时候出手了!

事件还原

昨夜西风凋敝树,独上高楼,望尽天涯路

本来豪情壮志想在 sqli-labs-master 上大展手脚的时候,却出师不利。

① 正常显示 ?id=1
在这里插入图片描述
② 单引号注入
居然没报错!!!不正常,难道被过滤了?不慌,且看看。
在这里插入图片描述
③ 布尔注入 ?id=1 and 1=1
按理来说,and 前后为真,输出肯定正常。
在这里插入图片描述
④ ?id=1 and 1=2
1=2 为 false,正常情况下应该会报错,可是。。。
在这里插入图片描述
至此,判断一个点是否为 SQL 注入点的基本三步骤都不奏效,难道源码的过滤措施已经如此到位?但也不应该啊,sqli-labs-master 本来就是一个 SQL 注入的练习场,本该有漏洞,而且还是第一关。。。

衣带渐宽终不悔,为伊消得人憔悴

① 不能盲猜,代码审计走起。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>

<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">


<?php
//including the Mysql connect parameters.
include("../sql-connections/sql-connect.php");
error_reporting(0);
// take the variables 
if(isset($_GET['id']))
{
$id=$_GET['id'];
//logging the connection parameters to a file for analysis.
$fp=fopen('result.txt','a');
fwrite($fp,'ID:'.$id."\n");
fclose($fp);


$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
$result=mysql_query($sql);
$row = mysql_fetch_array($result);

	if($row)
	{
  	echo "<font size='5' color= '#99FF00'>";
  	echo 'Your Login name:'. $row['username'];
  	echo "<br>";
  	echo 'Your Password:' .$row['password'];
  	echo "</font>";
  	}
	else 
	{
	echo '<font color= "#FFFF00">';
	print_r(mysql_error());
	echo "</font>";  
	}
}
	else { echo "Please input the ID as parameter with numeric value";}

?>
</font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>

结果惊奇得发现,毫无破绽,完全没有对特殊字符做转义或者过滤,代码都是原滋原味地拼接成 SQL 语句然后查询数据库的,完全符合寻常 SQL 漏洞的代码布局啊。

② 初露端倪
审计源码的时候发现了一个有趣的东西,它的作用在于把输入保存在一个 result.txt 文件里面。
在这里插入图片描述
③ 发现症结
在保存到输入里面,找到我之前输入的单引号,居然被转义了,难怪不报错!!!但是为什么会被转义呢?
在这里插入图片描述
④思考
冷静地理一下思路。
第一:从客观上来讲,sqli-labs-master 这个靶场在第一关肯定会产生单引号报错,教程上也是这解法。
第二:从技术层面上看,常见的判断 SQL 注入点的三步骤都不奏效,可见此处和靶场的设定有出入。
第三:从源码上看,存在很明显的 SQL 注入漏洞。
综上所述,问题的根源绝非源代码出错。那是浏览器的问题?靶场能在浏览器上正常运行,应该不是。那是环境配置的问题?有可能。

众里寻他千百度,慕然回首,那人却在灯火阑珊处

自己实在不能解决,那就得借助网络的力量,在一番查询下,问题的症结终现端倪。
① 了解搭建的环境
此处是用了 phpstudy2013 搭建的环境,它集成了 MySQL + apache + php。
②配置
大概了解php和apache的配置,主要用到php.ini和httpd.conf ,而此处主要了解的是php.ini的配置。
一般情况下,为了对 PHP 代码的安全加固和防止 SQL 注入,在php.ini中safe_mode = On,就是返回php执行错误的 display_errors 这会返回很多有用的信息。
其次就是另外一个配置选项 magic_quotes_gpc,高版本的默认都是magic_quotes_gpc=On,它会把提交的变量中所有的 ’ (单引号), " (双引号), \ (反斜线) 和 空字符会自动转为含有反斜线的转义字符,例如把’变成了’,把\变成了\。
在这里插入图片描述
③ 解决
可以关闭 magic_quotes_gpc ,然后重启一下apache,或者在源码中加入以下代码。意思是判断 magic_quotes_gpc,如果是开启的话,调用 stripcslashes 函数,删除在被转义字符前面添加的反斜杠。

if(get_magic_quotes_gpc())
		{
			$id = stripcslashes($id);
		}

④ 验证 ?id=1’
在这里插入图片描述

尾声

即便是单引号被转义,也是可以有绕过的方法,但是此举也是为了还原 sqli-labs-master 靶场原本的运行环境,实乃无奈之举。

共勉!!!

																									                   猪头
                                                                                                                   2019.12.9
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值