实验吧_登陆一下好吗(骚注入)&你真的会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 ...
随机推荐
- qt中控件的使用函数
1.Text Edit编辑框 //将编辑框中的内容转化成Utf8编码 ui->textEdit->toPlainText().toUtf8(); 2.Combo Box下拉框的应用 (1) ...
- 【R语言系列】read.table报错incomplete final line found by readTableHeader
文件内容: id,SGBH,DMSM1,SGDO,SGFSSJ 1,310117620,伤人事故,上海市,2018-03-02 20:04:00 2,310117621,死亡事故,杭州市,2018-0 ...
- PostMan 调用WCF Rest服务
问题描述: 现在有已有的WCF服务,但是ajax是不能请求到这个服务的: 需要把WCF转成WCF REST 的风格. 以下是从WCF转 WCF REST的步骤 1.首先在接口定义的地方加上 请求 We ...
- installutil 安装windows service
1:路径:C:\Windows\Microsoft.NET\Framework\v4.0.30319 2:执行指令:C:\Windows\Microsoft.NET\Framework\v4.0.30 ...
- Linux的安装和使用技巧
LinuxCentOs开始设置一个普通的用户,如果想进入root用户,可以su然后设置密码,然后第二次再次输入su,然后输入相同的密码就可以进去了 有很多命令需要在root下才能执行,但是在创建时却是 ...
- python安装及写一个简单的验证码组件(配合node)
1.安装Python 到官网下载响应系统的版本(这里以windows为例):https://www.python.org/downloads/windows/ 然后就是不断地"下一步&quo ...
- 扩展Microsoft Graph数据结构 - 架构扩展
前言 此前我有一篇 文章 讲解了Microsoft Graph的一种数据扩展技术-- 开发扩展(Open Extensions),它可以实现在支持的对象(例如用户,组等)上面附加任意的数据.但开放扩展 ...
- Web移动端适配总结
移动端适配的相关概念以及几种方案总结 适配相关概念 布局视口(layout viewport):html元素的上一级容器即顶级容器,用于解决页面在手机上显示的问题.大部分移动设备都将这个视口分辨率设置 ...
- AutoCAD中的扩展字典及扩展记录(C#)
在学习CAD扩展记录的过程中,遇到了一些问题,也积累了一些经验,现在给大家分享一些我的学习心得.在学习扩展字典之前需要读者了解cad的组码,也就是DxfCode.感兴趣的也可以了解一下扩展数据的相关内 ...
- Delphi Web开发连载 --ThinkDelphi (序)
如果把Delphi比作男人,那他曾经独步天下,笑傲江湖过: 如果把Delphi比作女子,那她曾经貌美如花,倾国倾城过! 但那只是历史,那只是曾经, 弹指一挥间,Delphi却似乎英雄迟暮,美人已老.. ...