mirror of
https://github.com/nganhkhoa/CTF-All-In-One.git
synced 2024-12-24 19:21:15 +07:00
update
This commit is contained in:
parent
6cebda926b
commit
ef8e772074
@ -71,6 +71,8 @@
|
||||
- [3.3.4 返回导向编程(ROP)](doc/3.3.4_rop.md)
|
||||
- [3.3.5 堆利用](doc/3.3.5_heap_exploit.md)
|
||||
- [3.4 Web](doc/3.4_web.md)
|
||||
- [3.4.1 SQL 注入利用](doc/3.4.1_sql_injection.md)
|
||||
- [3.4.2 XSS 漏洞利用](doc/3.4.2_xss.md)
|
||||
- [3.5 Misc](doc/3.5_misc.md)
|
||||
- [3.6 Mobile](doc/3.6_mobile.md)
|
||||
|
||||
@ -118,6 +120,8 @@
|
||||
- [6.2.4 re CSAWCTF2015 wyvern](doc/6.2.4_re_csawctf2015_wyvern.md)
|
||||
- [6.2.5 re PicoCTF2014 Baleful](doc/6.2.5_re_picoctf2014_baleful.md)
|
||||
- [6.2.6 re SECCON2017 printf_machine](doc/6.2.6_re_seccon2017_printf_machine.md)
|
||||
- web
|
||||
- [6.3.1 web HCTF2017 babycrack](doc/6.3.1_web_hctf2017_babycrack.md)
|
||||
|
||||
- [七、实战篇](doc/7_exploit.md)
|
||||
- CVE 分析
|
||||
|
@ -62,6 +62,8 @@ GitHub 地址:https://github.com/firmianay/CTF-All-In-One
|
||||
* [3.3.4 返回导向编程(ROP)](doc/3.3.4_rop.md)
|
||||
* [3.3.5 堆利用](doc/3.3.5_heap_exploit.md)
|
||||
* [3.4 Web](doc/3.4_web.md)
|
||||
* [3.4.1 SQL 注入利用](doc/3.4.1_sql_injection.md)
|
||||
* [3.4.2 XSS 漏洞利用](doc/3.4.2_xss.md)
|
||||
* [3.5 Misc](doc/3.5_misc.md)
|
||||
* [3.6 Mobile](doc/3.6_mobile.md)
|
||||
* [四、技巧篇](doc/4_tips.md)
|
||||
@ -106,6 +108,8 @@ GitHub 地址:https://github.com/firmianay/CTF-All-In-One
|
||||
* [6.2.4 re CSAWCTF2015 wyvern](doc/6.2.4_re_csawctf2015_wyvern.md)
|
||||
* [6.2.5 re PicoCTF2014 Baleful](doc/6.2.5_re_picoctf2014_baleful.md)
|
||||
* [6.2.6 re SECCON2017 printf_machine](doc/6.2.6_re_seccon2017_printf_machine.md)
|
||||
* web
|
||||
* [6.3.1 web HCTF2017 babycrack](doc/6.3.1_web_hctf2017_babycrack.md)
|
||||
* [七、实战篇](doc/7_exploit.md)
|
||||
* [7.1.1 [CVE-2017-11543] tcpdump 4.9.0 Buffer Overflow](doc/7.1.1_tcpdump_2017-11543.md)
|
||||
* [八、附录](doc/8_appendix.md)
|
||||
|
@ -1 +1,279 @@
|
||||
# 1.4.3 JavaScript基础
|
||||
|
||||
- [使用浏览器执行前端 JavaScript](#通过浏览器执行前端-javaccript)
|
||||
- [JavaScript 数据类型](#javascript-数据类型)
|
||||
- [JavaScript 编程逻辑](#javascript-编程逻辑)
|
||||
- [JavaScript 打印数据](#javascript-打印数据)
|
||||
- [JavaScript 框架](#javascript-框架)
|
||||
- [JavaScript DOM 和 BOM](#javascript-dom-和-bom)
|
||||
- [JavaScript 混淆](#javascript-混淆)
|
||||
- [使用 Node.js 执行后端 JavaScript](#使用-node.js-执行后端-javascript)
|
||||
- [Node.js 模块](#node.js 模块)
|
||||
|
||||
## 使用浏览器执行前端 JavaScript
|
||||
|
||||
大多数浏览器通过 F12 可以调出调试窗口,如图所示。在调试窗口中可以执行相关代码。JS 是一种解释性语言,由解释器对代码进行解析。
|
||||
|
||||
```
|
||||
console.log("Hello World!")
|
||||
```
|
||||
|
||||
![](../pic/1.4.3_chorme_f12.png)
|
||||
|
||||
在浏览器中,会集成 JS 的解析引擎,不同的浏览器拥有不同的解析引擎,这就使得 JS 的执行在不同浏览器上有不同的解释效果。
|
||||
|
||||
浏览器 | 引擎 |
|
||||
--- | --- |
|
||||
IE/Edge|Chakra|
|
||||
Firefox|SpiderMonkey|
|
||||
Safari|SFX|
|
||||
Chrome|V8|
|
||||
Opera|Carakan|
|
||||
|
||||
嵌入在 HTML 中的 JS 代码通常有以下几种形式:
|
||||
|
||||
```
|
||||
直接插入代码块
|
||||
<script>console.log('Hello World!');</script>
|
||||
|
||||
加载外部 JS 文件
|
||||
<script src="Hello.js"></script>
|
||||
|
||||
使用 HTML 标签中的事件属性
|
||||
<a href="javascript:alert('Hello')"></a>
|
||||
```
|
||||
|
||||
## JavaScript 数据类型
|
||||
|
||||
作为弱类型的语言,JS 的变量声明不需要指定数据类型:
|
||||
|
||||
```
|
||||
var pi=3.14;
|
||||
var pi='ratio of the circumference of a circle to its diameter';
|
||||
```
|
||||
|
||||
当然,可以通过“ new ”来声明变量类型
|
||||
|
||||
```
|
||||
var pi=new String;
|
||||
var pi=new Number;
|
||||
var pi=new Boolean;
|
||||
var pi=new Array;
|
||||
var pi=new Object;
|
||||
```
|
||||
|
||||
上一个示例也展示了 JS 的数据类型,分别是字符串、数字、布尔值、数组和对象。
|
||||
|
||||
有两个特殊的类型是 Undefined 和 Null,形象一点区分,前者表示有坑在但坑中没有值,后者表示没有坑。另外,所有 JS 变量都是对象,**但是需要注意的是,对象声明的字符串和直接赋值的字符串并不严格相等**。
|
||||
|
||||
## JavaScript 编程逻辑
|
||||
|
||||
### 基础
|
||||
|
||||
JS 语句使用分号分隔。
|
||||
|
||||
### 逻辑语句
|
||||
|
||||
if 条件语句
|
||||
|
||||
```
|
||||
if (condition)
|
||||
{
|
||||
代码块
|
||||
}
|
||||
else
|
||||
{
|
||||
代码块
|
||||
}
|
||||
```
|
||||
|
||||
switch 条件语句
|
||||
|
||||
```
|
||||
switch(n)
|
||||
{
|
||||
case 1:
|
||||
代码块
|
||||
break;
|
||||
case 2:
|
||||
代码块
|
||||
break;
|
||||
default:
|
||||
代码块
|
||||
}
|
||||
```
|
||||
|
||||
for/for in 循环语句
|
||||
|
||||
```
|
||||
for (代码1;代码2;代码3)
|
||||
{
|
||||
代码块
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
for (x in xs)
|
||||
{
|
||||
代码块
|
||||
}
|
||||
```
|
||||
|
||||
while/do while 循环语句
|
||||
|
||||
```
|
||||
while (条件)
|
||||
{
|
||||
代码块
|
||||
}
|
||||
```
|
||||
|
||||
```
|
||||
do
|
||||
{
|
||||
代码块
|
||||
}
|
||||
while (条件);
|
||||
```
|
||||
|
||||
## JavaScript 打印数据
|
||||
|
||||
在浏览器中调试代码时,经常用到的手段是打印变量。
|
||||
|
||||
|
||||
函数|作用
|
||||
--|--
|
||||
window.alert()|弹出警告框
|
||||
document.write()|写入HTML文档
|
||||
console.log()|写入浏览器控制台
|
||||
|
||||
![](../pic/1.4.3_window_alert.png)
|
||||
|
||||
|
||||
![](../pic/1.4.3_document_write)
|
||||
|
||||
## JavaScript 框架
|
||||
|
||||
JS 同样有许多功能强大的框架。大多数的前端 JS 框架使用外部引用的方式将 JS 文件引入到正在编写的文档中。
|
||||
|
||||
### jQuery
|
||||
|
||||
jQuery 封装了常用的 JS 功能,通过选择器的机制来操纵 DOM 节点,完成复杂的前端效果展示。
|
||||
|
||||
### Angular
|
||||
|
||||
实现了前端的 MVC 架构,通过动态数据绑定来简化数据转递流程。
|
||||
|
||||
### React
|
||||
|
||||
利用组件来构建前端UI的框架
|
||||
|
||||
### Vue
|
||||
|
||||
MVVM 构架的前端库,理论上讲,将它定义为数据驱动、组件化的框架,但这些概念也可能适用于其他框架,所以可能只有去真正使用到所有框架才能领悟到它们之间的区别。
|
||||
|
||||
### 其他
|
||||
|
||||
还有许许多多针对不同功能的框架,比如针对图表可视化、网络信息传递或者移动端优化等等。
|
||||
|
||||
### 双向数据绑定
|
||||
|
||||
传统基于MVC的架构的思想是数据单向的传送到 View 视图中进行显示,但是有时我们还需要将视图层的数据传输回模型层,这部分的功能就由前端 JS 来接手,因此许多近几年出现的新框架都使用数据双向绑定来完成MVVM的新构架,这就带给了用户更多的权限接触到程序的编程逻辑,进而产生一些安全问题,比较典型的就是许多框架曾经存在的模板注入问题。
|
||||
|
||||
## JavaScript DOM 和 BOM
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
|DOM|文档对象模型,JS 通过操纵 DOM 可以动态获取、修改 HTML 中的元素、属性、CSS 样式,这种修改有时会带来 XSS 攻击风险|
|
||||
|BOM|浏览器对象模型,类比于 DOM,赋予 JS 对浏览器本身进行有限的操纵,获取 Cookie、地理位置、系统硬件或浏览器插件信息等|
|
||||
|
||||
## JavaScript 混淆
|
||||
|
||||
由于前端代码的可见性,出于知识产权或者其他目的,JS 代码通过混淆的方法使得自己既能被浏览器执行,又难以被人为解读。常见的混淆方法有重命名变量名和函数名、挤压代码、拼接字符、使用动态执行函数在函数与字符串之间进行替换等。下面对比代码混淆前后的差异。
|
||||
|
||||
```
|
||||
混淆前
|
||||
console.log('Hello World!');
|
||||
|
||||
混淆后
|
||||
console["\x6c\x6f\x67"]('\x48\x65\x6c\x6c\x6f \x57\x6f\x72\x6c\x64\x21');
|
||||
|
||||
更加复杂的混淆
|
||||
eval(function(p,a,c,k,e,d){e=function(c){return(c<a?"":e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1;};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p;}('1.0(\'3 2!\');',4,4,'log|console|World|Hello'.split('|'),0,{}))
|
||||
```
|
||||
|
||||
由于之前提到的特性,无论混淆有多么复杂,最终它都能够在浏览器中被解释执行。
|
||||
|
||||
## 使用 Node.js 执行后端 JavaScript
|
||||
|
||||
在 [安装完成](https://nodejs.org/en/download/) Node.js 后,我们可以尝试编写第一个后端 JS 程序。
|
||||
|
||||
1.打开文本编辑器,写入
|
||||
|
||||
```
|
||||
console.log("Hello World");
|
||||
```
|
||||
|
||||
并保存为 hello.js
|
||||
|
||||
2.使用
|
||||
|
||||
```
|
||||
node hello.js
|
||||
```
|
||||
|
||||
来执行文件
|
||||
|
||||
![](../pic/1.4.3_nodejs)
|
||||
|
||||
## Node.js 模块
|
||||
|
||||
Node.js 同样通过丰富的模块提供强大的功能,模块使用 npm 进行管理。
|
||||
|
||||
events,事件模块,提供事件触发和事件监听功能
|
||||
|
||||
util,核心功能模块,用于弥补核心 JS 功能的不足
|
||||
|
||||
fs,文件操作模块,提供文件操作 API
|
||||
|
||||
http,Web协议模块,提供 Web 协议交互功能
|
||||
|
||||
express,Web框架,用于快速构建 Web 应用服务
|
||||
|
||||
vm,沙箱模块,提供干净的上下文环境
|
||||
|
||||
后端 JS 就会存在其他语言后端所同样存在安全问题,包括基础的 Web 攻击、服务端模板注入、沙箱逃逸、内存溢出等问题。
|
||||
|
||||
## 参考资料
|
||||
|
||||
[JavaScript 教程](http://www.runoob.com/js/js-tutorial.html)
|
||||
|
||||
[Node.js 教程](http://www.runoob.com/nodejs/nodejs-tutorial.html)
|
||||
|
||||
[浅谈 Node.js 安全](https://zhuanlan.zhihu.com/p/28105239)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1 +1,16 @@
|
||||
# 常见 Web 服务器基础
|
||||
|
||||
- [Apache HTTP Server](#apache-http-server)
|
||||
- [Nginx](#nginx)
|
||||
- [IIS](#iis)
|
||||
|
||||
由于涉及到 Web 服务器和应用服务器的差别问题,这里着重介绍三款使用广泛的 Web 服务器。
|
||||
|
||||
当客户端按照 HTTP 协议发送了请求,服务端也写好了处理请求的逻辑代码,这时就需要一个中间人来接收请求,解析请求,并将请求放入后端代码中执行,最终将执行结果返回的页面传递给客户端。另外,我们还要保证整个服务能同时被大规模的人群使用,Web 服务器就充当了这样的角色。
|
||||
|
||||
## Apache HTTP Server
|
||||
|
||||
## Nginx
|
||||
|
||||
## IIS
|
||||
|
||||
|
@ -1 +1,151 @@
|
||||
# 1.4.5 OWASP Top Ten Project 漏洞基础
|
||||
|
||||
- [OWASP Project](#owasp-project)
|
||||
- [注入](#注入)
|
||||
- [失效的身份认证](#失效的身份认证)
|
||||
- [敏感信息泄露](#敏感信息泄露)
|
||||
- [XML 外部实体](#xml-外部实体)
|
||||
- [失效的访问控制](#失效的访问控制)
|
||||
- [安全配置错误](#安全配置的错误)
|
||||
- [跨站脚本](#跨站脚本)
|
||||
- [不安全的反序列化](#不安全的反序列化)
|
||||
- [使用含有已知漏洞的组件](#使用含有已知漏洞的组件)
|
||||
- [不足的日志记录和监控](#不足的日志记录和监控)
|
||||
|
||||
## OWASP Project
|
||||
|
||||
OWASP 是一个开放的 Web 安全社区,影响着 Web 安全的方方面面,OWASP 每隔一段时间就会整理更新一次 “Top 10” 的 Web 漏洞排名,对当前实际环境常见的漏洞进行罗列,虽然漏洞排名经常引起业界的争议,但是在开源环境下,该计划公布的漏洞也能够客观反映实际场景中的某些问题,因此,我们选择 OWASP Top Ten 来作为 Web 方向的漏洞入门介绍材料。
|
||||
|
||||
## 注入
|
||||
|
||||
用一个不严谨的说法来形容注入攻击,就是,本应该处理用户输入字符的代码,将用户输入当作了代码来执行,常见于解释型语言。主要有以下几种形式:
|
||||
|
||||
|类别|说明|
|
||||
|----|----|
|
||||
|SQL 注入|最常见的注入形式,通过恶意拼接数据库语句,来实现非预期的功能|
|
||||
|系统命令注入|通过拼接来执行非预期的操作系统指令|
|
||||
|表达式语言注入|Java 中常见的命令注入执行方式|
|
||||
|服务端模板注入|使用模板引擎的语言常见的注入形式|
|
||||
|
||||
一个简单的例子如下所示,这是一段身份认证常见的代码
|
||||
|
||||
```
|
||||
SELECT * FROM users WHERE username = 'admin' and password = '123456'
|
||||
```
|
||||
|
||||
这个查询接收用户输入的账号和密码,放入数据库中进行查询,如果查询有结果则允许用户登录。在这种情况下,攻击者可以注入用户名或密码字段,来修改整个 SQL 语句的逻辑,用户可以提交这样的用户名:
|
||||
|
||||
```
|
||||
admin' -- -
|
||||
```
|
||||
|
||||
这时,应用程序将执行以下查询:
|
||||
|
||||
```
|
||||
SELECT * FROM users WHERE username = 'admin' -- -' and password = '123456'
|
||||
```
|
||||
|
||||
这里使用了 SQL 语句中的注释符(--),将密码部分查询注释掉,因此上面语句等同于:
|
||||
|
||||
```
|
||||
SELECT * FROM users WHERE username = 'admin'
|
||||
```
|
||||
|
||||
此时,仅仅通过用户名而不需要密码,我们便可成功登陆一个账号。
|
||||
|
||||
|
||||
## 失效的身份认证
|
||||
|
||||
身份认证对于 Web 应用程序尤为重要,它是鉴别用户权限并授权的重要依据。但是,由于设计缺陷,许多登陆窗口缺乏验证码机制,导致攻击者可以低成本的对用户口令进行爆破攻击。另一方面,大量存在的弱口令或默认口令使得攻击者可以轻易的猜测出用户的常用口令,窃取用户权限。
|
||||
|
||||
当用户身份得到确定后,通常会使用会话来保持一定时间的权限,避免用户短时间内需要多次重复认证。但是,如果会话 ID 处理不当,有可能导致攻击者获取会话 ID 进行登录。
|
||||
|
||||
## 敏感数据泄露
|
||||
|
||||
一种场景是由于没有进行科学的加密方法,导致敏感数据以明文形式泄露。另一种场景是由于人为的管理不当,导致个人信息、登录凭证泄漏到公网中,常见的敏感数据泄露包括网站备份文件泄露、代码仓库泄露、硬编码凭证于代码中导致的泄露。
|
||||
|
||||
比如,在 Github 中搜索口令或者 API 关键字,可以发现大量私人的凭证直接写在代码中被上传到 Github 仓库中。
|
||||
|
||||
## XML 外部实体
|
||||
|
||||
从某种意义上说,XXE 也是一种注入攻击。通过利用 XML 处理器对外部实体的处理机制,将用户的外部实体输入代替已定义的实体引用,执行恶意代码。
|
||||
|
||||
一个典型的 XXE 攻击如下所示:
|
||||
|
||||
```
|
||||
POST /AjaxSearch.ashx HTTP/1.1
|
||||
Host: test.com
|
||||
Content-Type: text/xml;
|
||||
|
||||
<!DOCTYPE foo [ <!ENTITY xxe SYSTEM "file:///etc/passwd"> ]>
|
||||
<c>&xxe</c>
|
||||
```
|
||||
|
||||
我们创建了一个外部引用文档类型定义去访问一个敏感的系统文件,而这个外部引用会在应用程序中替代已经命名的实体去执行,最终获取到敏感文件,如果这个时候的执行结果会返回给用户,那么用户就可以看到敏感文件中的内容。
|
||||
|
||||
## 失效的访问控制
|
||||
|
||||
如果采用安全的代码框架编写模式,很有可能会造成访问控制失效问题,比如某一个需要用户登录才能访问的主页面,其中的某些功能实现的页面并没有添加权限认证过程,导致虽然攻击者无法访问主页面,但却能够访问到功能页面执行功能函数。
|
||||
|
||||
另一种常见的漏洞就是用户权限跨越,典型的方式是通过明文的 ID 数字来赋予用户权限,攻击者可以修改 ID 号来获取任意用户权限。
|
||||
|
||||
![](../pic/1.4.5_access_control)
|
||||
|
||||
## 安全配置错误
|
||||
|
||||
由于配置疏忽,导致一些额外的信息、账户、文件可以被攻击者获取所导致的漏洞。常见的就是由于配置不当导致的目录遍历。
|
||||
|
||||
使用如下语句在 Google 中可以搜索到可目录遍历的网站,当然,许多网站也使用这种目录遍历的方式提供用户下载服务。
|
||||
|
||||
```
|
||||
intitle:index of
|
||||
```
|
||||
|
||||
## 跨站脚本
|
||||
|
||||
跨站脚本攻击(XSS)通过插入恶意脚本代码来窃取用户信息,获取用户权限以及配合其他漏洞发动更加复杂的攻击,一个最基本的 XSS 攻击如下所示,恶意脚本在 script 标签内,这一段脚本将会弹出你在当前页面上的 cookie 信息。
|
||||
|
||||
```
|
||||
<script>alert(document.cookie)</script>
|
||||
```
|
||||
|
||||
XSS 漏洞根据表现形式的不同,主要有以下三种类型。
|
||||
|
||||
### 反射型 XSS
|
||||
|
||||
有时,开发者会将一些用户可控的输入返回到网页中,如果返回的位置能够插入脚本语言或者触发事件,就存在反射型 XSS,通常攻击者发动这类攻击时需要受害者进行交互,因此这种攻击存在一定的局限性。
|
||||
|
||||
### 存储型 XSS
|
||||
|
||||
存储型 XSS 是指当页面从持久化存储中读取内容并显示时,如果攻击者能够将 XSS 攻击代码写入持久化存储中,那么当任意用户访问漏洞页面时,都将触发恶意代码,因此,这种攻击具有更加严重的风险。
|
||||
|
||||
### DOM 型 XSS
|
||||
|
||||
DOM 型 XSS 是由于攻击者可控的内容被加入到了正常的 JS 的框架或者 API 中导致的漏洞。
|
||||
|
||||
## 不安全的反序列化
|
||||
|
||||
序列化是一种数据对象传递手段,在传递数据值的同时保留了数据的结构属性。但是,如果在数据传递过程中处理不当,导致用户可控序列数据,在数据反序列化过程中就有可能造成命令执行或者越权行为。由于包括 Java、Python、PHP 等在内的语言都包含序列化和反序列化功能,根据不同的语言特性,利用方法有细微差距。
|
||||
|
||||
## 使用含有已知漏洞的组件
|
||||
|
||||
供应链安全是比较热门的话题,由于许多开源库被广泛用于各大社区、商业软件中,同时有部分的开源库并未得到有效维护,由此带来的供应链安全导致许多用户范围很广的软件存在着隐患。
|
||||
|
||||
当 0 day 漏洞公布后,一些场景无法及时的打补丁,也会使自身容易被攻击者利用。
|
||||
|
||||
## 不足的日志记录和监控
|
||||
|
||||
对系统、服务日志的有效监控会增加攻击者的入侵成本,因此,及时有效的日志记录、日志审计也应该是安全建设的重要环节。
|
||||
|
||||
需要强调的是,有时不足的日志记录方式还会产生严重的漏洞利用点,有可能被攻击者用来传递 Webshell。
|
||||
|
||||
## 参考资料
|
||||
|
||||
[2017-owasp-top-10](http://www.owasp.org.cn/owasp-project/2017-owasp-top-10)
|
||||
|
||||
《黑客攻防技术宝典 - Web 实战篇》
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
1
doc/3.4.1_sql_injection.md
Normal file
1
doc/3.4.1_sql_injection.md
Normal file
@ -0,0 +1 @@
|
||||
# 3.4.1 SQL 注入利用
|
1
doc/3.4.2_xss.md
Normal file
1
doc/3.4.2_xss.md
Normal file
@ -0,0 +1 @@
|
||||
# 3.4.1 XSS 漏洞利用
|
264
doc/6.3.1_web_hctf2017_babycrack.md
Normal file
264
doc/6.3.1_web_hctf2017_babycrack.md
Normal file
@ -0,0 +1,264 @@
|
||||
# 6.3.1 web HCTF2017 babycrack
|
||||
|
||||
- [题目解析](#题目解析)
|
||||
- [解题流程](#解题流程)
|
||||
|
||||
|
||||
## 题目解析
|
||||
|
||||
题目就不用多说了,很容易发现是 JavaScript 代码审计。
|
||||
|
||||
整个文件的变量名/函数名可以看作是混淆了的,分析一下整个文件的结构
|
||||
|
||||
```
|
||||
——
|
||||
|- _0x180a,关键字的替换数组
|
||||
|- 匿名函数,对数组元素进行重排
|
||||
|- _0xa180,取出对应索引的数组元素
|
||||
|- check,主要的分析函数
|
||||
|- test,主要的运行函数
|
||||
```
|
||||
|
||||
这道题结合浏览器进行动态调试,可以节省很多脑力。
|
||||
|
||||
首先是重排,这里不需要去深究到底逻辑原理,让引擎代替你去把数组重排好即可。结合程序员计算器和 CyberChef 分析更加方便。
|
||||
|
||||
## 解题流程
|
||||
|
||||
这样我们可以直接进入 check 函数进行分析。
|
||||
|
||||
|
||||
|
||||
```
|
||||
——
|
||||
|- _0x2e2f8d,又一次进行数组混淆,得到一个新数组
|
||||
|- _0x50559f,获取 flag 的前四位,即 ‘hctf’
|
||||
|- _0x5cea12,由 ‘hctf’ 生成一个基数
|
||||
|- 这里有一个 debug 的事件,个人认为是阻止使用 F12 调试用的,所以可以直接删去
|
||||
|- 匿名函数,对 _0x2e2f8d 这个数组再进行排列
|
||||
|- _0x43c8d1,根据输入获取数组中相应值的函数
|
||||
|- _0x1c3854,将输入的 ascii 码转化为 16 进制,再加上 ‘0x’
|
||||
```
|
||||
|
||||
以上部分可以看成是准备部分,这一部分的难点在于多次处理了数组,在动态调试时,很多函数如果多次执行就会产生与原答案不同的数组结构,因此,每次执行都需要重新初始化。
|
||||
|
||||
```
|
||||
——
|
||||
|- _0x76e1e8,以下划线分割输入,从后面分析可以得知 flag 一共有 5 段
|
||||
|- _0x34f55b,这一段给出了第一个逆向的条件,结合下一句 if 条件。
|
||||
```
|
||||
|
||||
单独来分析,其实最初我看掉了一个括号,结果弄混了符号优先级,导致觉得这个条件没有意义。
|
||||
|
||||
这个条件是说,**第一段的最后两个字符的 16 进制和 ‘{’ 的 16 进制异或后,对第一段的长度求余应该等于 5 **。
|
||||
|
||||
这里可以先进行如下猜测
|
||||
|
||||
第一段,已经有 ‘hctf{’ 了,这里正好去最后两位,先猜测第一段一共只有 7 位,这个猜测是后验的,先不细说。
|
||||
|
||||
```
|
||||
——
|
||||
|- b2c
|
||||
```
|
||||
|
||||
理解这个函数极为重要,通过随机输入进行测试,输出结果有些眼熟,像是 base64 但不对,比对后确定是 base32 编码,知道这个就不用再去多解读它了。同时,这里也有一个 debug 需要删除
|
||||
|
||||
```
|
||||
——
|
||||
|- e,第二个逆向条件
|
||||
```
|
||||
|
||||
|
||||
这一句是说,**第三段做 base32 编码,取等号前的部分,再进行 16 进制和 0x53a3f32 异或等于 0x4b7c0a73 **
|
||||
|
||||
```
|
||||
计算 0x4b7c0a73^0x53a3f32=0x4E463541
|
||||
4E463541 => NF5A 16 进制转字符
|
||||
NF5A => iz base32 解码
|
||||
```
|
||||
|
||||
因此,flag 暂时如下 hctf{x\_x\_iz\_x\_x}
|
||||
|
||||
```
|
||||
——
|
||||
|- f,第三个逆向条件
|
||||
```
|
||||
|
||||
这一句是说,第四段和第三段一样编码后,和 0x4b7c0a73 异或等于 0x4315332
|
||||
|
||||
```
|
||||
计算 0x4315332^0x4b7c0a73=0x4F4D5941
|
||||
4F4D5941 => OMYA
|
||||
OMYA => s0
|
||||
```
|
||||
|
||||
flag hctf{x\_x\_iz\_s0\_x}
|
||||
|
||||
```
|
||||
——
|
||||
|- n,f*e*第一段的长度(先不管)
|
||||
|- h,将输入字符串的每一个字符 ascii 码进行计算(*第二段长度)
|
||||
后连接起来显示(字符到 ascii 码转换)
|
||||
|- j,将第二段以 ‘3’ 分割,又后面可以确定是分成了两部分
|
||||
|- 第四个逆向条件
|
||||
```
|
||||
|
||||
首先是,**分割的两部份长度相等,第一部分和第二部分 16 进制异或等于 0x1613 **,这个条件只能后验,也先不管。
|
||||
|
||||
```
|
||||
——
|
||||
|- k,输入的 ascii 码*第二段的长度
|
||||
|- l,第一部分逐字符 ascii 码*第二段长度等于 0x2f9b5072
|
||||
```
|
||||
|
||||
首先,0x2f9b5072 == 798707826
|
||||
|
||||
```
|
||||
798 707 826
|
||||
正好分成三个,已知h是对应 ascii 码*常数,
|
||||
所以假设第一部分有三个字符,那么就是变成了求解常数
|
||||
也就是 798 707 826 的最大公约数
|
||||
求解得常数为 7
|
||||
字符 114 101 118 => rev
|
||||
```
|
||||
|
||||
所以,第二段一共有 7 个字符,前四个字符为 rev3,带入上面的后验条件 0x1613
|
||||
|
||||
```
|
||||
0x726576^0x1613=0x727365
|
||||
727365 => rse
|
||||
```
|
||||
|
||||
flag hctf{?\_rev3rse\_iz\_s0\_?}
|
||||
|
||||
```
|
||||
——
|
||||
|- m,第五个逆向条件,第五段的前四位和第一段的长度有关
|
||||
```
|
||||
|
||||
题目的 hint 提示,每一段都有意义,因此我们这里做个爆破,假设第一段的长度在 6-30 之间,我们可以算出 n,在用 n 去算第五段前四位。
|
||||
|
||||
```
|
||||
n = f*e*(6-30)
|
||||
第五段前四位 = n % 0x2f9b5072 + 0x48a05362
|
||||
```
|
||||
|
||||
代码:
|
||||
|
||||
```
|
||||
import binascii
|
||||
for i in range(6,31):
|
||||
n = 0x4315332*0x4b7c0a73*i
|
||||
strings = n%0x2f9b5072 + 0x48a05362
|
||||
print binascii.a2b_hex(str(hex(strings))[2:-1])
|
||||
```
|
||||
|
||||
结果:
|
||||
|
||||
```
|
||||
qK┒
|
||||
h4r
|
||||
_;
|
||||
Vn
|
||||
L钔V
|
||||
sr姘
|
||||
j[瘶
|
||||
aDx€
|
||||
X-Ah
|
||||
O
|
||||
P
|
||||
u?
|
||||
l傡
|
||||
ck祕
|
||||
ZT~b
|
||||
Q=GJ
|
||||
w羆
|
||||
n?
|
||||
e掤t
|
||||
\{籠
|
||||
Sd凞
|
||||
JMM,
|
||||
p裦
|
||||
g?n
|
||||
^ⅧV
|
||||
U嬃>
|
||||
```
|
||||
|
||||
可以看到大多数字符都没有意义,除了 h4r 让人遐想联翩,可惜还是不全,但是结合已经分析出的 flag,猜测应该是 h4rd。
|
||||
|
||||
|
||||
flag hctf{??\_rev3rse\_iz\_s0\_h4rd?}
|
||||
|
||||
```
|
||||
——
|
||||
|- _0x5a6d56,将输入重复指定次数组合
|
||||
|- 第六个逆向条件和第七个逆向条件
|
||||
```
|
||||
|
||||
1. 第五段的第六位重复两次不等于倒数第 5-8 位,这个条件也让人摸不着头脑。
|
||||
2. 第五段倒数第 2 位等于第五段第五位加 1
|
||||
3. 第五段第 7-8 位去掉 0x 等于第五段第 7 位的 ascii 码\*第五段长度\*5
|
||||
4. 第五段第五位为 2,第五段 7-8 位等于第五段第 8 位重复两次
|
||||
5. 结合 hint
|
||||
|
||||
由以上条件可以推出以下 flag
|
||||
|
||||
```
|
||||
hctf{??_rev3ser_iz_s0_h4rd2?3??3333}
|
||||
```
|
||||
|
||||
先假设 2 和 3 之间没有数字了,这时 7-8 位还未知但是 7-8 位相同,这时的方程
|
||||
|
||||
```
|
||||
而且在这里,由于直接把 0x 去掉,所以 x 的 16 进制一定全为数字
|
||||
字符拼接 {hex(x)hex(x)} = ascii(x)*13*5
|
||||
```
|
||||
|
||||
爆破代码:
|
||||
|
||||
```
|
||||
import binascii
|
||||
|
||||
for i in range(1,128):
|
||||
string1 = hex(i)[2:]
|
||||
try:
|
||||
if int(string1+string1) == i*13*5:
|
||||
print chr(i)
|
||||
except:
|
||||
continue
|
||||
|
||||
output: e
|
||||
```
|
||||
|
||||
验证前面的后验条件可以确定如下 flag
|
||||
|
||||
```
|
||||
hctf{??_rev3ser_iz_s0_h4rd23ee3333}
|
||||
```
|
||||
|
||||
只剩下最前面的两位,为了方便,利用题目提供的 sha256 结果,我就不回溯条件在判断,直接进行碰撞。
|
||||
|
||||
```
|
||||
import hashlib
|
||||
|
||||
a = 'hctf{'
|
||||
b = '_rev3rse_iz_s0_h4rd23ee3333}'
|
||||
|
||||
e1 = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k',
|
||||
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
|
||||
e2 = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k',
|
||||
'l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
|
||||
|
||||
for i in e1:
|
||||
for j in e2:
|
||||
sh = hashlib.sha256()
|
||||
sh.update(a+i+j+b)
|
||||
if sh.hexdigest() == "d3f154b641251e319855a73b010309a168a12927f3873c97d2e5163ea5cbb443":
|
||||
print a+i+j+b
|
||||
```
|
||||
|
||||
output:
|
||||
|
||||
```
|
||||
hctf{j5_rev3rse_iz_s0_h4rd23ee3333}
|
||||
```
|
BIN
pic/1.4.3_chorme_f12.png
Normal file
BIN
pic/1.4.3_chorme_f12.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
BIN
pic/1.4.3_document_write.png
Normal file
BIN
pic/1.4.3_document_write.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 20 KiB |
BIN
pic/1.4.3_nodejs.png
Normal file
BIN
pic/1.4.3_nodejs.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.4 KiB |
BIN
pic/1.4.3_window_alert.png
Normal file
BIN
pic/1.4.3_window_alert.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
BIN
pic/1.4.5_access_control.png
Normal file
BIN
pic/1.4.5_access_control.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.1 KiB |
1
src/writeup/6.3.1_web_hctf2017_babycrack/=_=.js
Normal file
1
src/writeup/6.3.1_web_hctf2017_babycrack/=_=.js
Normal file
File diff suppressed because one or more lines are too long
49
src/writeup/6.3.1_web_hctf2017_babycrack/index.html
Normal file
49
src/writeup/6.3.1_web_hctf2017_babycrack/index.html
Normal file
@ -0,0 +1,49 @@
|
||||
<html>
|
||||
<head>
|
||||
<title>Welcome to HCTF</title>
|
||||
<style type="text/css">
|
||||
@font-face {
|
||||
font-family: "Proxima Nova";
|
||||
src: url("fonts/ProximaNova.woff2");
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Proxima Nova";
|
||||
src: url("fonts/ProximaNovaBold.woff2");
|
||||
font-weight: bold;
|
||||
}
|
||||
* {
|
||||
font-family: "Proxima Nova", sans-serif;
|
||||
}
|
||||
body {
|
||||
background-color: #F0F0F0;
|
||||
}
|
||||
#panel {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translateX(-50%) translateY(-50%);
|
||||
text-align: center;
|
||||
font-size: 1.25em;
|
||||
}
|
||||
#panel #message {
|
||||
margin: 10px;
|
||||
padding: 20px;
|
||||
background-color: #FFF;
|
||||
border-radius: 5px;
|
||||
font-size: 1em;
|
||||
border: 1px solid #000;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
<script src="=_=.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="panel">
|
||||
<h2>H4v3 a g0od t1m3!:></h2>
|
||||
<img src="leimu.jpg" style="height:65%; max-height:300px;" />
|
||||
<form onsubmit="javascript:test();return false;" action="javascript:test();">
|
||||
<input type="text" id="message" autocomplete="off" autofocus placeholder="hctf{xxxxxx}" />
|
||||
</form>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
BIN
src/writeup/6.3.1_web_hctf2017_babycrack/leimu.jpg
Normal file
BIN
src/writeup/6.3.1_web_hctf2017_babycrack/leimu.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 200 KiB |
Loading…
Reference in New Issue
Block a user