Zer0e's Blog

CTF入门(坑)总结——web篇

字数统计: 1.8k阅读时长: 6 min
2018/03/12 Share

为期一个月的hgame寒假训练赛终于结束了。每周都在做题,讲真这么用功学习还真是很少见。当然,一个月时间自己也学到了很多(虽然还是咸鱼),这里感谢学长们花了很长时间出题目,也感谢几位学长耐心给我解答=。=
这篇文章是对寒假学习知识的梳理,也仅代表本咸鱼的观点,如有错误请指出。另外,这边文章也以我在假期写的四篇wp作为参考,链接如下:
https://github.com/zer0e/writeup2018

基础总结

代码审计

代码审计通常不会单独成题目,而是结合web漏洞来成题,例如:


你首先需要审计代码才能知道该如何绕过限制(当然这段代码有点短),先是知道pattern是什么,然后了解json怎么绕过。所以说代码审计在比赛中绝对是基础中的基础,对此你需要了解相应的语言。

请求头的查看与修改

请求头在web中是最常见的东西,相应的请求头中的信息我们更需要加以利用。例如:



通过修改请求头来达到我们的目的。至于如何修改,之后说。

工具使用

工具的使用那就很多了。常见的web工具有burpsuite(一款强大的网络工具),sqlmap(sql漏洞检查工具)等等,具体可以网上找找相应的ctf工具合集。这里我们可以用burpsuite来进行抓包改包重发包。

类似的工具还有很多,需要自己慢慢去摸索。

脚本书写

脚本的书写通常是在工具已经无法满足我们要求时,我们需要自己书写脚本来实现某种特定的要求。这里我推荐的脚本语言为python,毕竟人生苦短,我用python。=。=假期的时候自己也写过一些脚本。这里就不贴出来了。

综上,想打ctf,基础知识和工具使用一定必不可少。下面讲讲新手会碰到的常见漏洞。

常见漏洞梳理

LFI

PHP当中有许多的常见的漏洞,其中最常见的就是文件包含漏洞。在假期的学习中,遇见的两题常见的文件包含漏洞。

1.直接通过修改文件路径来获得文件内容。

我们发现url后带有文件路径,随即修改路径为flag.php查看response即可拿到flag。

2.通过php伪协议来读取文件。那么什么是php伪协议?php中支持的伪协议有以下几种:

1
2
3
4
5
6
7
8
9
10
11
12
file:// — 访问本地文件系统
http:// — 访问 HTTP网址
ftp:// — 访问 FTP
php:// — 访问各个输入/输出流
zlib:// — 压缩流
data:// — 数据
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect://处理交互式的流

这里我们重点要说的就是php://
先给出官方文档
http://php.net/manual/zh/wrappers.php.php

之后我会写一篇详细的文章讲讲我对php://伪协议的理解,这里便不再多讲。
回到题目,有时候我们无法通过直接输入文件名来获取文件,便需要使用php伪协议来把文件的base64编码后的内容读出,从而获得flag。

1
2
//我们常用的php任意文件读取payload
php://filter/read=convert.base64-encode/resource=upload.php

这里使用的过滤器为convert.base64-encode,字面上就可以知道是把读取的内容encode成base64编码。过滤器的问题,我一起留到后面的文章。

以上就是常见的两种LFI漏洞的利用。

xss

xss,全程为Cross Site Scripting,也称跨站脚本攻击。攻击者通过在web页面中插入恶意的script代码,当有用户访问这个页面时,该用户就会受到攻击。xss分为存储型和反射型。反射型xss,是非持久的,只有用户自己点击链接才会触发。而存储型xss,是攻击者插入到服务器的恶意代码,例如博客文章等地方。这种xss通常比较危险。

要理解xss,就必须理解html语言。
例如:

出题者已经给出了关键代码。那么我们怎么去插入一段代码让网页弹窗出现数字1呢?
我们知道代码过滤了script,image还有左括号,由于img标签没有被过滤,我们就可以通过img标签的onerror来执行恶意代码。构造:

1
<img src='' onerror=alert&#40;1)>

如此,便完成一次了xss攻击,事实上,攻击者通常将alert(1)换成其他恶意的代码来进行攻击,例如盗取cookie等等。

sqli

sqli,通常意义上指数据库注入。攻击者通过对参数的修改来达到访问数据库的目的。
例如有以下的php语句:

1
2
$user = $_GET['user'];
$query="select * from users where username='".$user."'";

由于没有任何过滤,攻击者可以通过修改user的值来对数据库进行访问。例如攻击者使username=’ and 1=1

那么后台的sql查询语句就变为:

1
select * from users where username='' and 1=1;

由于1=1为永真式,那么这条语句就会列出user表中的所有数据。这必定造成极大的危害。

sql注入通常有两类,有回显的注入和无回显的注入。有回显的注入又分为带有数据的回显型注入,基于布尔的注入,还有基于报错的注入等等。无回显的注入,一般有基于时间延迟的注入。

一般新手使用的是sql注入自动化工具——sqlmap,一个可以自动判断类型和自动注入的python脚本。但我还是希望每位初学者可以少用或者不用这些脚本,如果连原理都不明白,那也只是单纯的一个脚本小子而已。当你明白原理,知道怎么做之后,那用用别人的脚本确实是没什么的。

这些注入整理我也会在以后的学习和比赛中慢慢积累和学习,这里便不在多讲。

下面以一道例题结束这篇文章。

我们发现一个网站存在注入,并且后端已经有单引号了。
所以我们就可以进行爆库,也称脱库。

这里先爆数据库的名称。一般来说sql注入题最后都有一个闭合符合#,但这题自动帮你加上了。(毕竟是新手题)
然后就是一爆到底了。

1
2
3
4
5
6
7
8
//爆表名
id=1 union select 1,table_name from information_schema.tables where table_schema=database()
//列名
id=1 union select 1,group_concat(column_name) from information_schema.columns where table_name='xxxx' //xxx是表的名称
//字段名
id=1 union select 1,yyy from xxx //xxx为表名,yyy为列名

//提示:由于UNION 内部的每个 SELECT 语句必须拥有相同数量的列,所以union select 后有两个参数。

这就是sql的新手入门题了。

这篇文章讲的不是很多,但算是我假期间对web知识的再学习和补充。下次我将讲讲我对ctf中misc杂项的入门总结。

CATALOG
  1. 1. 基础总结
    1. 1.1. 代码审计
    2. 1.2. 请求头的查看与修改
    3. 1.3. 工具使用
    4. 1.4. 脚本书写
  2. 2. 常见漏洞梳理
    1. 2.1. LFI
    2. 2.2. xss
    3. 2.3. sqli