一、前言 这几天在教同学web安全,其中就包括了sql注入。 原本我觉得很简单的东西,到了他们眼里,变得很复杂。 这也引发我的思考,是不是应该站在小白的角度,去解释这个东西。 所以写这个帖子,很长,有目录,大家可以根据需求选择的看 本文原创作者:sucppVK,本文属i春秋原创奖励计划 (ps:不少童鞋对sql注入一知半解,自以为掌握了,就不屑于去学习,这是很可怕的) (ps:本教程基于mysql) ---------------------目录-------------------------------------
(上篇) ---------------------------------------------------------------
二、正文 (接上篇) -----------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,两个字节来表示 这样会有什么危害? 



中转注入(从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注入,最好还是去玩数据库吧 (完结)
|