基于PHP代码底层分析sql注入攻击漏洞原理以及修复问题
1.SQL注入定义
首先,再次复习一遍sql注入攻击的定义,
SQL注入是攻击者通过把恶意SQL命令插入到Web表单的输入域或页面请求的查询字符串中,来达到欺骗服务器执行恶意的SQL命令的一种攻击方式。
2.SQL注入的流程
1.判断Web系统使用的脚本语言,找注入点,确定是否存在SQL注入漏洞
2.判断Web系统的数据库类型
3.判断数据库中表及相应字段的结构
4.构造注入语句,获得表中数据内容
5.查找网站管理员后台,用得到的管理员账号和密码登录
6.结合其他漏洞,想办法上传一个Webshell
7.进一步提权,得到服务器的系统权限
3.基于PHP底层分析sql注入攻击漏洞原理
SQL注入多见于PHP的程序中,因为PHP输入弱类型语言,例如:参数id=5,PHP会自动推导变量id的类型为int类型,id=5 and 1=1 则会推导为String类型,是弱类型语言的特征,而Java等强类型语言,如果把一个字符串转化为int类型,处理不当就会显示出异常,无法继续执行。且大部分由数据库作为驱动的web程序的三层架构为表示层、业务逻辑层、数据访问层,其中表示层呈现HTML内容也就是美观的网站,而业务逻辑层则负责加载编译并执行PHP文件(调用数据库)、数据访问层执行sql语句并在数据库中查询后返回数据,再由业务逻辑层发送html文件呈现给用户,所以想要调用数据库,必须经过php文件,是最重要的一环,很多调用代码会在PHP文件这里出现,PHP代码中连接数据库所用的函数mysql_connect()(连接数据库函数),mysql_query()(数据库查询函数),mysql_num_rows()(查询数据行数),mysql_select_db()(数据库选择函数)和mysql_close()(mysql关闭函数)有些会在php中的$database-connection直接写明,
4.具体实例分析
某登录页面源代码如下
<html>
<head>
<title>用户登录</title>
<meta http-equiv="content-type"content="text/html;charset=utf-8">
</head>
<body>
<form action="server.php" method="post">//登陆时,会把表单数据提交给server.php页面,server.php页面来判断用户输入的用户名和密码是否符合要求,这一步至关重要,也往往是SQL漏洞所在。
<fieldset >
<legend>登录页面</legend>
<table>
<tr>
<td>用户名:</td>
<td><inputtype="text" name="username"></td>
</tr>
<tr>
<td>密 码:</td>
<td><inputtype="text" name="password"></td>
</tr>
<tr>
<td><inputtype="submit" value="提交"></td>
<td><inputtype="reset" value="重置"></td>
</tr>
</table>
</fieldset>
</form>
</body>
</html>
PHP页面源代码如下<html><head>
<title>登录验证</title>
<meta http-equiv="content-type"content="text/html;charset=utf-8">
</head>
<body>
<?php
$conn=@mysql_connect("localhost",'root','')or die("数据库连接失败!");;
mysql_select_db("injection",$conn) or die("您要选择的数据库不存在");
$name=$_POST['username'];
$pwd=$_POST['password'];
$sql="select * from users where username='$name' andpassword='$pwd'";
$query=mysql_query($sql);
$arr=mysql_fetch_array($query);
if(is_array($arr)){
header("Location:manager.php");
}else{
echo "您的用户名或密码输入有误,<a href="Login.php">请重新登录!</a>";
}
?>//将用户提交的数据用户名和密码直接执行,没有实现进行特殊字符过滤,sql语句直接显示出来可以利用进行构造
如果,用户名和密码都匹配成功的话,将跳转到管理界面manager.php。
</body>
</html>
5.修复方式
1.添加图形码进行验证
添加图形码增加代码的安全性,给机器强制破解有一定的拦截作用,但不能阻止所有的攻击,还是需要在程序上进行安全性考虑
2.使用预备义语句和参数化查询
使用预处理语句和参数化查询。预处理语句和参数分别发送到数据库服务器进行解析,参数将会被当作普通字符处理。这种方式使得攻击者无法注入恶意的SQL。
常用的方式有两种
2.1 使用PDO(PHP Data Objects )在默认情况使用PDO并没有让MySQL数据库执行真正的预处理语句。
2.2 使用MySQLi
3.对用户传递的参数进行处理
Web提交数据有两种方式,一种是get、一种是post,很多常见的sql注射就是从get方式入手的,而且注入的语句里面是包含一些sql语句(sql语句有四大句:select 、update、delete、insert),而且一些字符也可能会对数据库造成危害,比如 ’ _ ‘, ’ %’(可以将magic_quotes_gpc打开),在提交的数据中进行过滤,能够避免这些问题。
注:magic_quotes_gpc是配置在php.ini中,magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post、get、cookie过来的数据,增加转义字符“\”,对POST、POST、__GET以及进行数据库操作的sql进行转义处理,以确保这些数据不会引起程序,特别是数据库语句因为特殊字符引起的污染而出现致命的错误,防止sql注入。
当magic_quotes_gpc = On时,输入数据中含单引号(’)、双引号(”)、反斜线(\)与 NULL(NULL 字符)等字符,都会被加上反斜线。

浙公网安备 33010602011771号