32

DVWA开启渗透测试之旅与代码分析(二)

 4 years ago
source link: https://www.freebuf.com/articles/web/218170.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

大家好,我是你们的朋友cmdback,咱们书接上回。之前本地搭建环境以及配合代码分析说了一下暴力破解、文件上传、文件包含、命令注入,这次还是以代码分析为主,实验为辅助说一下SQL注入、XSS跨站脚本漏洞等漏洞。

SQL注入

sql注入指的是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。这种类型的漏洞都可能获取网站管理员权限的,尤其是MSSQL数据库。

low级别的sql注入:

通常我们在测试注入的时候,都会习惯的在搜索框或者参数后面直接输入’或者1′,看看有没有报错,如果报错的话看看报错信息是否包含数据库信息或者其它的敏感信息,如果有的话,我们可以抓取一下信息包,直接放在sqlmap工具中直接跑。这样的话如果遇到测试站点有waf防护的话,我们还要加载绕过waf的脚本。今天我们首先用手工来测试一下sql漏洞。

我们看出代码中的id参数是直接通过get请求接收到,然后放入数据库中进行查询,这样的代码存在一定的缺陷,未对id参数做过滤,可能造成sql注入漏洞: rMJVziU.jpg!web

分别输入1和1′来测试一下是否存在sql注入或者是页面是否会报错,通过测试,显然在输入1′的时候,页面会报错,直接把数据库的类型直接显示在页面,故存在sql注入漏洞:

YFjAVbz.jpg!webbiAjaib.jpg!web 我们首先测试一下有几个字段,构造sql查询语句:

1' order by 2#; --->SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2#';

当我们输入查询语句的时候,页面未报错,故可以继续把字段数加大。

Bbm63qy.jpg!web

1' order by 3#; --->SELECT first_name, last_name FROM users WHERE user_id = '1' order by 3#';

页面报错,显然字段数为2。

zUJzYzE.jpg!web 这样我们知道了字段的个数为2,SELECT first_name, last_name FROM users WHERE user_id = ‘$id’ ;

first_name 指的是第一个字段;last_name指的是第二个字段;这样我们利用联合查询的方法来对这两个位置进行注入:

1′ union select 1,version()#;   //查询数据库的版本信息

736zmaZ.jpg!web

1′ union select database(),2#;  //查询数据库的名称

2Q7Bzeq.jpg!web

1′union select 1,group_concat(table_name) from information_schema.tables where table_schema=’dvwa’#  //查询dvwa数据库的表名称

IzInM3N.jpg!web

1′ union select 1,group_concat(column_name) from information_schema.columns where table_name=’users’#; //查询users表中的列

mmyu22J.jpg!web

1′ union select 1,group_concat(user_id,first_name,last_name,user,password,avatar) from users#;  //查询user、password的内容

2MRBRjA.jpg!web 经过MD5解密后,发现密码为password:

aANRBvb.jpg!web med级别注入:

这段代码确实利用mysqli_real_escape_string()函数对用户输入的id参数进行转义字符中的特殊值。可以看处此处的接收id参数的方法是post方法。

ZRzIr2f.jpg!web

我们通过抓取数据包可知,是采用post方法提交查询的:

将id=1修改为 id= 1 or 1 = 1,放行数据包就可以获取到所有的用户名:

下面进行的查询数据库的列数、用户密码就可以和上面的一样,只不过是通过抓包进行的,需要注意的是由于上面添加了mysqli_real_escape_string()函数会对特殊的字符进行过滤,所以自己在测试的时候需要将将字段进行转义或者别的绕过方法。如果我们知道网站的根目录的话,那么就可以直接写入webshell到网站根目录。或者直接的用工具直接了当的写文件即可。

sql盲注;

sql盲注在测试的过程中会告诉你是否为真或者为假。分为基于布尔的盲注、基于时间的盲注、基于报错的盲注。

 1、我们在测试是否存在SQL盲注的时候,服务器不会直接返回具体的数据库错误的信息;
 2、页面上面不会直接显示我们执行的结果;
 3、在特殊的情况下sql语句也可能不会执行成功;

小白先把盲注放一放。

XSS跨站脚本攻击:

XSS跨站脚本攻击指的是由于web应用程序未对用户的输入过滤并不严谨,攻击者可以利用此漏洞把恶意的脚本代码注入到网页中,当用户浏览这些网页的时候,就会执行其中的恶意代码,通常攻击者最为喜欢的是打管理员或者用户的cookies,然后这样就可以获取到用户名以及密码。通常插入的是HTML代码和客户端Javascript脚本。

反射型xss跨站脚本漏洞

low级别xss跨站脚本漏洞:

ANzuu2z.jpg!web 通过代码我们可以发现在第6行代码中的if语句中判断语句中未对用户输入的内容进行严格的过滤,攻击者可以通过插入恶意的脚本文件来执行弹窗。最为基础的测试的代码:<script>alert(123)</script>,成功弹窗。

q2iI73y.jpg!web 我们来通过审查元素看一下这段代码是否插入成功,通过审查元素可以看出,这段xss代码直接插入到了html页面当中。

uiqMru7.jpg!web medium级别xss跨站脚本:

6NbYneA.jpg!web 对用户的输入做了过滤,通过str_replace()函数name后面的参数进行字符的替换,遇到<script>就会替换成空格,这样的话我们之前的那种写法就会失败,执行结果命令如下,当我们输入<script>alert(123)<script>,就会触发str_replace()函数,将<script>转换为空格,结果为alert(123),这样的话就不会触发xss跨站脚本漏洞。

UfeqAjn.jpg!web 虽然可以过滤<script>标签,但是代码中只是过滤了一次,这样我们可以采用大小写、双标签绕过等方法。

AJFnayI.jpg!webqAvQ32e.jpg!web 在这里问说个小插曲,小白利用双<script>标签进行绕过的时候,没有弹窗,但是审查元素的时候可以看到这段代码已经插入到了html中。<<script>stcipt>alert(123)<script>。

FZZZN3N.jpg!web

high级别xss跨站脚本:

7F3ENzb.jpg!web 代码中使用了preg_replace()函数进行正则匹配敏感字符,我们再使用前两个的绕过方法已经不可行了,只要是<script>标签就直接会被替换成空格。我们来测试一下<script>alert(123)</script>,如果我们这样输入的话,就会触发preg_replace()函数,匹配完毕后就会只剩下一个字符>。

jmmIbaa.jpg!web 我们可以利用一下image标签进行绕过,<img src=”x” onerror=”alert(1)”>

qeyMzqQ.jpg!webbMNz6bb.jpg!web

impossible级别的xss跨站脚本:

3A3MZrZ.jpg!web 这个代码主要是添加了user_token,如果能够和服务器的User_token值一样才会执行下面的代码。这样的话在一定程度上面防御了xss跨站脚本漏洞。还进行了html的编码,利用 htmlspecialchars()函数是使用来把一些预定义的字符转换为HTML实体,返回转换后的新字符串,原字符串不变。如果 string 包含无效的编码,则返回一个空的字符串。绕过限制其实特简单,只要能够前后闭合,能够触发弹窗机制就可以成功,这需要自己平时在测试中摸索,也可以写一个Py脚本来试探哪些标签能够绕过,这样的话就可以形成一下自己的代码库。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK