实验吧_登陆一下好吗(骚注入)&你真的会PHP吗?(代码审计)
登陆一下好吗
首先看到两个输入框,分别对应账号密码,随手输个admin,admin进去,提交后发现有回显,既然题目说了过滤了一切,那就先看看过滤了些啥
经过一波测试,发现服务器过滤了union,select,or,for,#,/,*
这就很让人头疼了,没了or就没了万能密码,select也被过滤,我还真想不起来有什么注入语句了
只能去翻看wp学习一下了
一看真的是觉得脑洞大开
方法1:
username--> '='
password--> '='
膜一下大佬的思路:
首先猜测sql语句为:select * from user where username=’用户名’ and password=’密码’
这样当我们提交以上的payload后,查询语句就成了: select * from user where username=''='' and password=''=''
这里 ''='' 即 (空=空) 返回就是True,所以and前后都为True,查询语句就正确执行了
方法2:
利用mysql的数据类型转换:
原理是这样的:username是字符串类型的,当它接收到整型变量且值为0时,就会返回库内所有数据
这里同时也要用到mysql的数据类型转换,拿这里来说username=0与username='a'+0返回的结果是一样的('a'+0会自动进行类型转换,结果还是0)
目的是要构造sql语句:select * from user where username=0
还有另外一个小知识点:mysql的注释不仅有– ,/**/,#,还有一个 ;%00
所以这里第二种payload如下:
username--> a'+0;%00
passward-->
但我并没有成功,不过知道学到原理,要有成功的老哥请告诉我如何操作
方法3
原理同2,不过构造语句的思路不同
先给payload:
username--> \
passward--> ^'a
还是之前的查询语句,这次提交后变为select * from user where username='\' and password='^'a'
根据运算的优先级,这里会先比较两个字符串'\' and password='与'a'异或的结果会返回0
这也就达到了我们上面所描述的目的了
你真的会PHP吗?
在响应头中看到提示:6c525af4059b4fe7d8c33a.txt,应该就是一个代码审计
<?php $info = "";
$req = [];
$flag="xxxxxxxxxx"; ini_set("display_error", false);
error_reporting(0); //判断是否以POST 方式传入number,若没有就返回“have a fun!!”
if(!isset($_POST['number'])){
header("hint:6c525af4059b4fe7d8c33a.txt"); die("have a fun!!");
}
//遍历POST数组中的键与值,将键赋给key,再将值得两侧去掉空格,再判断值是否是字符串,若是则将其中的特殊字符转义后赋给req数组
foreach([$_POST] as $global_var) {
foreach($global_var as $key => $value) {
$value = trim($value);
is_string($value) && $req[$key] = addslashes($value);
}
} //构造的一个函数来判断传入的number是否是回文格式的,即一二三三二一这种格式
function is_palindrome_number($number) {
$number = strval($number);
$i = 0;
$j = strlen($number) - 1;
while($i < $j) {
if($number[$i] !== $number[$j]) {
return false;
}
$i++;
$j--;
}
return true;
} /*
首先获取number的值,判断是不是纯数字,若不是,则判断req数组中number键对应的值是否等于值本身int化再字符串化的值,若相等,接着判断int化的number对应的值是否
等于其反转后的值,若相等就判断number的值是否是回文形式,不是的话就返回flag
*/
if(is_numeric($_REQUEST['number'])){ $info="sorry, you cann't input a number!"; }elseif($req['number']!=strval(intval($req['number']))){ $info = "number must be equal to it's integer!! "; }else{ $value1 = intval($req["number"]);
$value2 = intval(strrev($req["number"])); if($value1!=$value2){
$info="no, this is not a palindrome number!";
}else{ if(is_palindrome_number($req["number"])){
$info = "nice! {$value1} is a palindrome number!";
}else{
$info=$flag;
}
} } echo $info;
代码分析就请看代码中的注释,我给每段都进行了说明
这里再给出几个函数的解释:
trim(str):去除str字符串两端的空格
addslashes(str):在str中的预定义字符前加上反斜杠,预定义字符有:单引号(')、双引号(")、反斜杠(\)、NULL
strval()/intval():将值转换为字符串/整型
strrev():反转字符串,比如将abc转为cba
总结一下这里要获取flag的要求:
1.以POST方式传入number的值
2.number的值为字符串且不能是纯数字的字符串
3.number的值=strval(intval($req['number']))
4.number整型化的值要与反转后的number整型化的值要相等
5.number的值不能是回文形式
这里的条件2,3是一对矛盾,4,5又是一对矛盾
要求number不是纯数字字符串那么intval后会把后面的字符给省略,这样就与3矛盾
4,5一看就是一对矛盾
经过一番搜索,参考了数篇wp,我了解到:
2,3可以通过空字符来绕过(如:%00)
is_numeric会判断%00为非数值,而且%00并不会被trim影响
接着就是解决4,5的矛盾
这里也有两种方法
方法1:intval函数溢出绕过
Intval最大的值取决于操作系统。 32 位系统最大带符号的 integer 范围是 -2147483648 到 2147483647。举例,在这样的系统上, intval(‘1000000000000’) 会返回 2147483647。64 位系统上,最大带符号的 integer 值是 9223372036854775807。这里就是应用最大值得反转,2147483647反转后为7463847412明显大于2147483647了,那它的值就会等于最大值2147483647,而且不是回文形式,所以这里POST的number=2147483647%00
方法2:用科学计数法构造0=0
构造number=0e-0%00,可直接绕过了
实验吧_登陆一下好吗(骚注入)&你真的会PHP吗?(代码审计)的更多相关文章
- 捅伊朗黑客PP — 后台登陆POST+错误回显 注入
看了一个泰国政府的网站被伊朗的黑客挂页,上面写着“Your Box 0wn3z By Behrooz_Ice – Q7x -Sha2ow -Virangar -Ali_Eagle -iman_takt ...
- CBC翻转攻击(实验吧_简单的登陆题)
题目链接 http://ctf5.shiyanbar.com/web/jiandan/index.php 有源码在test.php页面 分析代码过程 如果post id,将id转字符串,然后进入sql ...
- 实验吧_简单的sql注入_1、2、3
简单的sql注入1 看着这个简单的界面,一时间没有特别好的思路,先输入一个1',发生了报错 初步猜测这是一个字符型的注入,他将我们输入的语句直接当成sql语句执行了,按题目的意思后面肯定过滤了很多注入 ...
- 实验吧_天下武功唯快不破&让我进去(哈希长度拓展攻击)
天下武功唯快不破 第一反应就去抓包,看到返回包的header中有FLAG的值,base64解码后得到下图所示 这就要求我们在请求头中post相应key的值,我直接在burp中尝试了多次都没有用,想起来 ...
- 汇编语言_实验四_[bx]和loop的使用
四.实验结论 1. 实验内容1 (1)源代码: assume cs:code code segment mov ax,0b800h mov ds,ax mov bx,07b8h mov c ...
- 实验吧web登陆一下好吗
知识点: 万能密码'=' 一道登陆型的SQL注入题目,这种题目一般有四种题型: 1.在username中通过union联查select一个已知字符来与传递的password匹配完成登陆 2.使用万能密 ...
- 实验十三_编写、应用中断例程_2 & 总结
编写并安装int 7ch中断例程,功能为完成loop指令的功能 参数:(cx)= 循环次数,(bx)= 位移 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其注意观察int.iret指令执行前后 ...
- 实验吧_拐弯抹角(url伪静态)&Forms
拐弯抹角 先贴代码 <?php // code by SEC@USTC echo '<html><head><meta http-equiv="chars ...
- 实验吧_密码忘记了(vim编辑器+代码审计)&天网管理系统(php弱比较+反序列化)
密码忘记了 一开始尝试了各种注入发现都无效,在网页源码中找到了admin 的地址,输入地址栏发现并没有什么有用的信息,随便输个邮箱,网页返回了一个地址 ./step2.php?email=youmai ...
随机推荐
- python中Properties的一些小用法
property最大的用处就是可以为一个属性制定getter,setter,delete和doc,他的函数原型为: def __init__(self, fget=None, fset=None, f ...
- 分区表SQL调优/优化(Tuning)时容易“被欺骗”的场景之一
近几天没有用户找到,除了看看书,就是上网浏览点东西,好不惬意.可惜好景不长,正在享受悠闲惬意的日子时,一个用户的工作人员QQ找到我,说他们在统计一些数据,但一个SQL特别慢,或者说就从来没出过数据,我 ...
- I know 项目Alpha冲刺随笔集
Alpha冲刺 Day 1 Alpha冲刺 Day 2 Alpha冲刺 Day 3 Alpha冲刺 Day 4 Alpha冲刺 Day 5 Alpha冲刺 Day 6 Alpha冲刺 Day 7 Al ...
- C语言的第一次作业总结
PTA实验作业 题目一:温度转换 本题要求编写程序,计算华氏温度150°F对应的摄氏温度.计算公式:C=5×(F−32)/9,式中:C表示摄氏温度,F表示华氏温度,输出数据要求为整型. 1.实验代码: ...
- TRY
- DML数据操作语言之增加,删除,更新
1.数据的增加 数据的增加要用到insert语句 ,基本格式是: insert into <表名> (列名1,列名2,列名3,......) values (值1,值2,值3,..... ...
- [Cerc2013]Magical GCD
https://vjudge.net/problem/UVA-1642 题意:在一个序列中,找出一段连续的序列,使得长度*gcd最大 固定右端点,当左端点从左向右移动时,gcd不变或变大 gcd相同时 ...
- MySQL关系表查询两个表的数据
如下,有四张表:游戏类型表,游戏表,点卡和游戏关系表,点卡表 CREATE TABLE `gamesType`( `tId` INT AUTO_INCREMENT NOT NULL PRIMARY K ...
- Python内置函数(56)——locals
英文文档: locals() Update and return a dictionary representing the current local symbol table. Free var ...
- Spring Security入门(1-9)Spring Security 的xml 命名空间配置