实验吧-因缺思汀的绕过
时间:2022-07-22
本文章向大家介绍实验吧-因缺思汀的绕过,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
实验吧-因缺思汀的绕过
题目链接:http://www.shiyanbar.com/ctf/1940
查看源码,可以看到注释里提示了源码的位置,访问source.txt得到源码,然后开始审计吧!先把源码贴出来
<?php
error_reporting(0);
if (!isset($_POST['uname']) || !isset($_POST['pwd'])) {
echo '<form action="" method="post">'."<br/>";
echo '<input name="uname" type="text"/>'."<br/>";
echo '<input name="pwd" type="text"/>'."<br/>";
echo '<input type="submit" />'."<br/>";
echo '</form>'."<br/>";
echo '<!--source: source.txt-->'."<br/>";
die;
}
function AttackFilter($StrKey,$StrValue,$ArrReq){
if (is_array($StrValue)){
$StrValue=implode($StrValue);
}
if (preg_match("/".$ArrReq."/is",$StrValue)==1){
print "水可载舟,亦可赛艇!";
exit();
}
}
$filter = "and|select|from|where|union|join|sleep|benchmark|,|(|)";
foreach($_POST as $key=>$value){
AttackFilter($key,$value,$filter);
}
$con = mysql_connect("XXXXXX","XXXXXX","XXXXXX");
if (!$con){
die('Could not connect: ' . mysql_error());
}
$db="XXXXXX";
mysql_select_db($db, $con);
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
$query = mysql_query($sql);
if (mysql_num_rows($query) == 1) {
$key = mysql_fetch_array($query);
if($key['pwd'] == $_POST['pwd']) {
print "CTF{XXXXXX}";
}else{
print "亦可赛艇!";
}
}else{
print "一颗赛艇!";
}
mysql_close($con);
?>
通读源码可以发现,我们输入的username与password都使用了黑名单过滤,这也告诉我们是有机会的,毕竟黑名单存在绕过的可能性。黑名单如下:
$filter = "and|select|from|where|union|join|sleep|benchmark|,|(|)";
过滤了之后,执行了一条sql语句:
$sql="SELECT * FROM interest WHERE uname = '{$_POST['uname']}'";
这条语句拼接了我们输入的uname,也就是说注入点只可能存在于uname字段,接下来判断了sql语句的查询结果是否只有一条数据,如果成立就把我们post过去的密码与数据库中存储的密码进行比对,如果相同就打印flag!
mark 这儿也就是我们需要绕过的地方,其中最主要的又是绕过密码的比较。我一开始的思路是使用union语句构造一个类似于下面的语句:
}' union select 123,123#
然后密码输入123,就可以绕过了。但是发现绕不过它的过滤条件,搞了半天结果还是自己sql语句玩的不够熟练,,这里是巧妙地用了select过程中用group by with rollup这个统计的方法进行查询。group by with rollup会在统计后的产生一条null信息,然后在pwd里不写值,if就为true了。
所以只要我们用户名输入如下语句:
}' or 1 group by pwd with rollup limit 1 offset 2#
(该数据表中只有两条信息) 然后密码部分保持为空就可以得到flag。
mark
- windows平台下编辑的内容传到linux平台出现中文乱码的解决办法
- puremvc框架之Command
- python sorted函数
- Centos 6.9下部署Oracle 11G数据库环境的操作记录
- puremvc框架之proxy
- Oracle数据库冷备份与热备份操作梳理
- Oracle数据库重做日志及归档日志的工作原理说明
- 用vs.net2010做flex/flash/as3开发
- python中input()与raw_input()的区别到底是啥?
- VB下中文URL编码问题的解决
- 让ZeGraph在X方向上填满
- 中国区块链技术和产业发展论坛举行——区块链应用发展尚需时日
- silverlight获取外部数据的另一种选择:FluorineFx
- 存储状态数据
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kubernetes(k8s) Prometheus+grafana监控告警安装部署
- 基于OpencvCV的情绪检测
- 设计模式 之 抽象工厂模式
- Angular应用里HTTP请求的错误处理
- 使用npm安装TypeScript
- TypeScript的interface关键字
- TypeScript的class关键字
- TypeScript里一些特殊的类型
- TypeScript的类型断言,有点像ABAP的强制类型转换
- 什么是TypeScript的字符串索引签名
- [初探] proxy 的优势与使用场景
- TypeScript里的interface和class以及对应的JavaScript代码
- TypeScript里的interface扩展,多继承以及对应的JavaScript代码
- TypeScript里的混合类型
- 完全图解 HTTPS