SQL注入攻击(SQL Injection),简称注入攻击,是Web开发中最常见的一种安全漏洞。可以用它来从数据库获取敏感信息,或者利用数据库的特性执行添加用户,导出文件等一系列恶意操作,甚至有可能获取数据库乃至系统用户最高权限。
而造成SQL注入的原因是因为程序没有有效过滤用户的输入,使攻击者成功的向服务器提交恶意的SQL查询代码,程序在接收后错误的将攻击者的输入作为查询语句的一部分执行,导致原始的查询逻辑被改变,额外的执行了攻击者精心构造的恶意代码。

  1. SELECT username, password FROM Users WHERE id = 1;
  2. SELECT id FROM users WHERE username = "admin" AND password = "admin";

image.png
进行重构sql语句的方式,来进行sql注入

DVWA的漏洞

image.png

SQL注入是怎么产生的

  1. WEB开发人员无法保证所有的输入都已经过滤
  2. 攻击者利用发送给SQL服务器的输入参数构造可执行的SQL代码(可加入到get请求、post请求、http头信息、cookie中)
  3. PHP,数据库未做相应的安全配置(magic_quotes_gpc)

    SQL注入的方式

  4. 数字型注入

learn.me/sql/article.php?id=1(发送这个请求相当于调用一个查询语句)
$sql =”SELECTFROM article WHERE id =”.$id SELECTFROM ariticle WHERE id = 1 or 1

  1. 字符型注入

登录场景:登录界面包括用户名和密码输入框,以及提交按钮。输入用户名和密码,提交。
SELECTFROM user WHERE username =’admin’ADN password =’password’
SELECT
FROM user WHERE username =’admin’or’1’=’1#’ADN password =’password’

  1. 报错注入

主键重复
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));

  1. 其他注入

    SQL注入相关的函数

    1.Mysql数据操作

    1. 连接数据库
    2. mysqli_connecthostusernamepassworddbnameportsocket);
    3. 数据库的查询:
    4. mysqli_queryconnectionqueryresultmode);
    5. 用关键字索引取值:
    6. mysqli_fetch_arrayconnectionMYSQLI_ASSOC);
    7. mysqli_fetch_assocconnection);
    8. 用数字索引取值:
    9. mysqli_fetch_arrayconnectionMYSQLI_NUM);
    10. mysqli_fetch_rowconnection);

    2.数据处理函数

    1. mysqli_real_escape_string(connectionescapestring):
    2. 转义在SQL语句中使用的字符串中的特殊字符。
    3. escapestring要转义的字符串。编码的字符是 NUL(ASCII 0)、InIr1'、"和Control-Z
    4. addslashes():函数返回在预定义字符之前添加反斜杠的字符串。(stripslashes())
    5. 返回在预定义字符之前添加反斜杠的字符串。
    6. 预定义字符是:单引号('),双引号("),反斜杠(1),NULL
    7. preg_match(pattern,subject…)
    8. 搜索subject与pattern给定的正则表达式的一个匹配。

    SOL注入的防御

    作为测试人员,了解如何预防SQL注入,可以在发现注入攻击bug时,对bug产生原因进行定位。

  2. 严格检查输入变量的类型和格式对于整数参数

  3. 过滤和转义特殊字符在username这个变量前进行转义
  4. 加强对用户输入的验证
    1. 加强对用户输入内容的检查与验证
    2. 二是强迫使用参数化语句来传递用户输入的内容。
  5. 普通用户与系统管理员用户的权限要有严格的区分。

    SQL注入漏洞的审计流程

  6. 在seay中开启查询日志

  7. 查找系统的输入点,尝试输入一些内容并执行
  8. 跟随输入信息,判断输入的内容是否被过滤,是否可利用。
  9. 构造注入语句进行测试

    寻找输入点

  10. 表单提交,主要是POST请求,也包括GET请求。

  11. URL参数提交,主要为GET请求参数。
  12. Cookie参数提交。
  13. HTTP请求头部的一些可修改的值,比如Referer、User_Agent等。
  14. 一些边缘的输入点,比如.jpg文件的一些文件信息等。

    审计查看

    image.png
    没有对输入的id进行一个过滤和限制及预处理,导致sql注入的出现
    image.png
    查看,发现使用了mysqli_real_escape_string 的函数,但是这个语句的使用中,并没有使用单引号的设置,是直接使用id的值,进行查询,所以,mysqli_real_escape_string 这个函数就没有用处了,所以还是可以及逆行绕过进行注入

    pbootcms

    在线留言中进行尝试
    image.png

然后进行抓包修改

  1. contacts[ content', ' create_time', ' update time") VALUES ('1'. '1' ,1 and updatexml(1, concat(Ox3a. user()) 1) ):--a]

源码分析

使用了MVC模式的一个框架逻辑
image.png
image.png
有两种路由
服务路由和自定义路由
image.png
查看insert输入的数据
image.png
查看post输入
image.png
查看转移的实体
image.png
发现只对数据进行过滤但是没有进行对数据名进行过滤
查看插入数据库的函数
image.png
利用方式
image.png
image.png