• 网络对抗课题4.3.1 SQL注入原理与实践


    网络对抗课题4.3.1 SQL注入原理与实践

    原理

    SQL注入漏洞是指在Web应用对后台数据库查询语句处理存在的安全漏洞。也就是,在输入字符串中嵌入SQL指令,在设计程序中忽略对可能构成攻击的特殊字符串的检查。

    后台数据库将其认作正常SQL指令后正常执行,可能实现对后台数据库进行各种操作,甚至造成破坏后台数据库等严重后果。

    SQL注入一般分为普通注入和盲注。

    普通注入:后台数据库会回显有价值的提示信息,通过这些可能的报错信息可以更容易地进行注入,适合新手入门训练。

    盲注:后台管理员在给出错误页面时,没有提供详细错误信息。攻击者需要运用脚本通过仅有的判断信息(比如时间差)对表中的每一个字段进行探测,从而实现注入。

    本次实践主要是普通注入。

    环境搭建

    1.靶机组成:wampserver + DVWA-1.9 + MYSQL

    2.搭建过程:

    (1)下载安装wamp和MYSQL

    (2)下载DVWA安装包,解压缩到wampserver下的www目录

    (3)在地址栏输入http://localhost/DVWA-1.9/setup.php

    (4)进入setup界面,点击“Create/Reset Database”按钮时如果出现“Could not connect to the database - please check the config file.”的错误信息,那么请打开DVWA-1.9/config/config.inc.php文件,将下面这段内容

    $_DVWA[ 'db_password' ] = 'p@ssw0rd';
    

    中的密码部分替换成在步骤2中设置的MySQL root用户的密码(此处为空,直接把'p@ssw0rd'改为''就行了,即密码为空),再重新创建数据库即可。

    (5)进入链接http://localhost/DVWA-1.9/login.php,默认的用户名和密码为“admin/password”


    (6)调整实验难度为简单,并且打开左边SQL注入按钮,进入训练页面。



    手工注入实践

    1.输入框中键入 ' 并且提交

    回显:

    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。说明这个系统可能通过回显让我们知道后台的关键数据。

    分析:假设后台查询语句为:select 列 from 表 where ID= ? ,那么当在SQL语句后加上 or 1=1 ,则会变成 : select 列 from 表 where ID= ? or 1=1 ,或许能将数据全部显示。

    2.输入框中键入 'or 1=1' 并且提交

    回显:

    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

    分析:说明SQL语句仍然有错误,或许整个注释掉SQL语句后面的部分能够解决问题。在MYSQL中使用 -- 来完成注释工作。

    3.输入框中键入 'or 1=1 --' 并且提交

    回显:

    分析:假设后台查询语句为:select 列 from 表 where ID= '?' ,那么提交后查询语句变为: select 列 from 表 where ID= ''or 1=1 --'' 。-- 后部分注释掉,实际执行语句为:select 列 from 表 where ID= ''or 1=1 条件永真,从而显示全部信息。同时,我们可以知道一共有5列。

    总结:首先发现SQL注入漏洞,找到合适的终止字符构造可执行的SQL语句,找到返回所有行的方法,最后找到特殊的注释SQL字符忽略剩余SQL语句。

    分析:找到select语句执行方法后,我们可以使用UNION语句查找更多信息并显示。

    Union的用法为:select [列]1,...,[列]n from [表] Union select [列]1,...,[列]n from [表]

    其中子select查询语句的列数必须相同。

    4.输入框中键入 'Union select 1,--' 并且提交

    回显:

    分析:发现列数不对,应该为两列

    5.输入框中键入 'Union select 1,2--'并且提交

    回显:

    分析:证明其查询的列数为2列。

    6.输入框中键入 'Union select 1,table_name from INFORMATION_SCHEMA.tables -- '并且提交

    回显:


    分析:通过对系统表INFORMATION_SCHEMA的查询,可以看到每一个表的表名。从中可以看到两行 guestbook、users应该是DVWA所用表。

    7.输入框中键入 'Union select 1,column_name from INFORMATION_SCHEMA.columns where table_name = 'users' -- '并且提交

    回显:

    分析:通过这个语句,我们可以看到users表中的全部列的列名。从中可以发现password列。

    8.输入框中键入 'Union select NULL,password from users -- '并且提交

    回显:

    分析:这样我们可以得到密码的MD5值。

    通过concat()函数,我们可以连接参数,组成字符串。

    使用方法:CONCAT(str1,str2,…)

    9.输入框中键入 'Union select password,concat(first_name,' ',last_name,' ',user) from users -- ' 并且提交

    回显:

    分析:这样可以方便我们查询多种数据结果。

    工具注入实践

    各种工具对SQL注入的排名情况:

    排名 名称
    1 Wapiti
    2 Andiparos
    3 Paros Proxy
    6 Burp Suite
    9 W3AF

    本次实践使用工具为kali系统下内置的Sqlmap。它由Python语言开发,需要安装2.4版本后的Python解释器,支持 Mysql,Oracle,SQLserver ,access,sqlite等主流数据库。

    它支持五种SQL注入技术:基于布尔值得盲注,基于时间的盲注,基于错误的盲注,UNION查询和stacked查询。

    同时,它可以自动识别后台账户的哈希口令,并通过字典进行暴力破解。

    最后,当数据库是Mysql,PostgreSQL和 SQL Server时,支持上传和下载数据库文件。

    1.打开kali的默认浏览器iceweasel的插件Tamper Data。然后访问http://localhost/DVWA-1.9/login.php

    2.提交数据aa,Tamper Data选择Tamper,可以看到当前会话的cookie和请求参数等。


    3.如图使用sqlmap,附上-u 后跟目标url,--cookie=后跟获取的cookie

    结果如下:


    分析:工具显示的结果非常丰富。首先它探测出了URL中的id参数存在注入点,并且包含基于布尔变量,基于错误,基于Union联合查询,基于时间的注入类型。同时,目标主机的操作系统为win,Web应用平台为Apache 2.4.9,PHP 5.5.12,后台数据库为MySQL5.0。相关信息被保存在/usr/share/sqlmap/output/192.168.1.4目录下

    4.在上述语句后加上 --dbs -v 0,--dbs可以根据所识别的数据库类型来探测包含的数据库名称。-v 参数表明显示过程的复杂程度,从0到6一共7级,0最简单,只显示python错误以及严重的信息。

    结果:

    分析:结果显示有5个可用数据库,其中dvwa和information_schema应该为我们想找的数据库。后面3个为我主机mysql中原本的数据库。正常查看数据库可见:

    5.将指令后缀改为-D dvwa --tables,可以查询指定数据库dvwa下的所有表的名字

    结果:

    分析:可知在dvwa数据库下有两张表guestbook和users,其中users为我们感兴趣的表。

    6.将指令后缀改为-D dvwa -T users --columns,可以查询指定数据库dvwa和指定表users下的所有列的名字

    结果:

    分析:可见users表下有很多列,我们希望把它们都保存下来。--dump选项可以帮我们完成这项工作

    7.将指令后缀改为-D dvwa --tables -T users --columns --dump

    结果:






    分析:当工具检测到在列password中可能有密码哈希值时,问我们是否想它们另外存储并用其他工具破解。通过选择所用字典攻击模式后,可见工具帮我们完成密码哈希值的破解,并且最终统一显示并保存为csv文件。通过正常查看数据库可以验证结果

    总结

    通过这次sql注入实践,首先我了解了很多适合用于渗透的工具和练习的靶机环境,同时对于web应用建设的基本环节也有了进一步加深理解。同时,对于数据库的重要性也有了更深的认识。然后,通过sql手工注入操作,我又加深了对常规sql操作的熟练程度,也从一个新的角度来看待sql语句。同时,我也学习到了cookie在web访问中的重要性。最后,通过对sqlmap工具的使用,我完成了一次完整的渗透并拖库,破解数据的过程。这对于我熟悉现实中的注入常规操作非常有利。

  • 相关阅读:
    web&http协议&django初识
    jQuery
    BOM&DOM
    装饰器
    JavaScript
    模块
    面向对象编程
    函数
    CSS
    HTML
  • 原文地址:https://www.cnblogs.com/20135319zl/p/5737119.html
Copyright © 2020-2023  润新知