SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。
SELECT username, password FROM Users WHERE id = 1;
SELECT id FROM users WHERE username = "admin" AND password = "admin";
DVWA的漏洞
SQL注入是怎么产生的
- WEB开发人员无法保证所有的输入都已经过滤
- 攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)
PHP,数据库未做相应的安全配置(magic_quotes_gpc)
SQL注入的方式
数字型注入
learn.me/sql/article.php?id=1(发送这个请求相当于调用一个查询语句)
$sql =”SELECTFROM article WHERE id =”.$id SELECTFROM ariticle WHERE id = 1 or 1
- 字符型注入
登录场景:登录界面包括用户名和密码输入框,以及提交按钮。输入用户名和密码,提交。
SELECTFROM user WHERE username =’admin’ADN password =’password’
SELECTFROM user WHERE username =’admin’or’1’=’1#’ADN password =’password’
- 报错注入
主键重复select count(*),concat(version(),floor(rand(0)*2))x from information_schema.tables group by x;
xpath语法错误
SELECT updatexml(1,concat(Ox7e,(select@@version),0x7e),1);
SELECT extractvalue(1,concat(Ox7e,(select@@version),0x7e));
-
SQL注入相关的函数
1.Mysql数据操作
连接数据库
mysqli_connect(host,username,password,dbname,port,socket);
数据库的查询:
mysqli_query(connection,query,resultmode);
用关键字索引取值:
mysqli_fetch_array(connection,MYSQLI_ASSOC);
mysqli_fetch_assoc(connection);
用数字索引取值:
mysqli_fetch_array(connection,MYSQLI_NUM);
mysqli_fetch_row(connection);
2.数据处理函数
mysqli_real_escape_string(connection,escapestring):
转义在SQL语句中使用的字符串中的特殊字符。
escapestring要转义的字符串。编码的字符是 NUL(ASCII 0)、In、Ir、1、'、"和Control-Z
addslashes():函数返回在预定义字符之前添加反斜杠的字符串。(stripslashes())
返回在预定义字符之前添加反斜杠的字符串。
预定义字符是:单引号('),双引号("),反斜杠(1),NULL
preg_match(pattern,subject…)
搜索subject与pattern给定的正则表达式的一个匹配。
SOL注入的防御
作为测试人员,了解如何预防SQL注入,可以在发现注入攻击bug时,对bug产生原因进行定位。
严格检查输入变量的类型和格式对于整数参数
- 过滤和转义特殊字符在username这个变量前进行转义
- 加强对用户输入的验证
- 加强对用户输入内容的检查与验证
- 二是强迫使用参数化语句来传递用户输入的内容。
-
SQL注入漏洞的审计流程
在seay中开启查询日志
- 查找系统的输入点,尝试输入一些内容并执行
- 跟随输入信息,判断输入的内容是否被过滤,是否可利用。
-
寻找输入点
表单提交,主要是POST请求,也包括GET请求。
- URL参数提交,主要为GET请求参数。
- Cookie参数提交。
- HTTP请求头部的一些可修改的值,比如Referer、User_Agent等。
- 一些边缘的输入点,比如.jpg文件的一些文件信息等。
审计查看
没有对输入的id进行一个过滤和限制及预处理,导致sql注入的出现
查看,发现使用了mysqli_real_escape_string 的函数,但是这个语句的使用中,并没有使用单引号的设置,是直接使用id的值,进行查询,所以,mysqli_real_escape_string 这个函数就没有用处了,所以还是可以及逆行绕过进行注入pbootcms
在线留言中进行尝试
然后进行抓包修改
contacts[ content', ' create_time', ' update time") VALUES ('1'. '1' ,1 and updatexml(1, concat(Ox3a. user()) 1) ):--a]
源码分析
使用了MVC模式的一个框架逻辑
有两种路由
服务路由和自定义路由
查看insert输入的数据
查看post输入
查看转移的实体
发现只对数据进行过滤但是没有进行对数据名进行过滤
查看插入数据库的函数
利用方式