SQL注入初尝试

本文深入探讨了SQL注入攻击的原理和步骤,包括如何通过单引号判断字符型注入,利用UNION查询确定字段数,以及如何通过payload逐步揭示数据库信息。通过payload如'database()'和'group_concat()'函数,可以爆库名和字段信息,同时提到了盲注和报错注入等高级技巧。
摘要由CSDN通过智能技术生成

1、寻找注入点,确定注入类型

在这里插入图片描述通过使用 ’ 来区别,加上可以看到和上图不同的输出结果。在这里插入图片描述
id=1在数据库的存储形式大概是要么直接id=1或者id=‘1’或者id=“1”
#号是注释符,在url编码中是%23(%+对应字符的ASCII值的十六进制数)
这是因为我们输入了一个单引号所以如果把后边一个引号注释掉就可以存在db里了,格式在数据库里变为 id=‘1’#’
首先输入id为1,然后用单引号闭合发现报错 将单引号注释掉后恢复正常,其原因在上一篇中有提到,输入 ’ 后使得sql语句中多了一个单引号造成错误,而注释掉后面内容后又恢复正常,说明输入的单引号与前面的id=1也形成了一个闭合,因此可以判断注入类型为字符型,闭合方式为单引号

2、联合注入攻击

先判断字段数
id=1’ order by 1 --+

union有一个十分严格的约束条件,因为是联合查询,必选保证字段数一致,即两个查询结果有相同的列数,因此我们要对字段数进行判断
我们使用的是 order by number 其作用为输出第number列

在这里插入图片描述

如何做到只返回union查询
在这里插入图片描述 判断回显点
id=1’ union select 1,2,3 limit 1,1 --+
id=-1’ union select 1,2,3 --+
当我们知道该表的字段数之后,我们还需要确定在哪个字段出会输出有效信息 可以尝试一下
可以看到我们在union select 后拼接了数字1,2,3 而此时我们看到还加入了limit 1,1 这是为什么呢?
联合查询的输出是严格按照顺序进行的,因此当id=1存在时会在第0行输出第一个sql语句查询到的结果,自然我们输入的数字就到了下一行
而 limit num1,num2的作用为从第num1行开始显示num2行内容
我们可以看到2,3被输出了,说明这两个位置都可以作为回显点

当然我们也可以不用limit语句,只需让前面sql语句查询结果为空即可 如图
在这里插入图片描述
补充:
首先,select 之后可以接一串数字:1,2,3…只是一个例子,这串数字并不一定要按从小到大排列,也不一定从1开始,这串数字的值和顺序是任意的,甚至可以是重复的
select实际上没有向任何一个数据库查询数据,即查询命令不指向任何数据库的表。返回值就是我们输入的这个数组,这时它是个1行n列的表,表的属性名和值都是我们输入的数组,如下图:
在这里插入图片描述
在这里插入图片描述

3、爆出库名

id=-1’ union select 1,database(),3 --+
在这里插入图片描述
也可以使用group_concat() 将所有内容写入一行并输出
id=-1’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=‘security’ --+
在这里插入图片描述
payload:information_schema是mysql自带的库,记录了该数据库所有的表名和字段名
该句的含义为:查找数据库中security库下的所有表名
显然结果中的users十分关键
id=-1’ union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=‘security’ and table_name=‘users’ --+
在这里插入图片描述
id=-1’ union select 1,group_concat(username,0x5c,password),3 from security.users --+
在这里插入图片描述
0x5c是\的十六进制编码,为了将uname与pwd分开,也可改成其他任意字符
该payload意为:查询security库中users表中字段username与password的所有信息

盲注

顾名思义,页面只会显示You are in……… 或什么也不显示,即只有输入正确才会显示出内容,要么就什么也不显示出来,这就是布尔型的页面显示

length(database())、求数据库名的长度
ord()、函数返回字符串第一个字符的ASCII值
mid(str,pos,len) 、这里,str是字符串,pos是起始子字符串的位置,len是一个可选参数,它决定从起始位置返回的字符数
mid ()和substr()都是一样的用法

?id=1’ and mid((select table_name from information_schema.tables where table_schema=‘security’ limit 0,1),1,1)=‘e’ %23

报错注入

利用错误信息提示,获取数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值