<?php
show_source(__FILE__);
include("config.php");
$a=@$_GET['a'];
$b=@$_GET['b'];
if($a==0 and $a){
echo $flag1;
}
if(is_numeric($b)){
exit();
}
if($b>1234){
echo $flag2;
}
?>
is_numeric() 函数用于检测变量是否为数字或数字字符串。
数字和数字字符串则返回 TRUE,否则返回 FALSE
而因为PHP中有两种比较符号
=== 会同时比较字符串的值和类型
== 会先将字符串换成相同类型,再作比较,属于弱类型比较
abcd==0为真
1235是数字,但加了字母后1235abcd在不比较的时候就不是数字,
在比较的时候,PHP进行类型转换后又和1235相等
http://...:xxxx/?a=abcd&b=1235abcd
题解:
1.随便输入下用户名和密码,提示要用admin用户登入,然后跳转到了check.php,查看下源代码提示要用字典。
2.用burpsuite截下登录的数据包,把数据包发送到intruder爆破
2.设置爆破点为password
3.加载字典
4.开始攻击,查看响应包列表,发现密码为123456时,响应包的长度和别的不一样.
5.点进去查看响应包,获得flag
<html>
<head>
<title>JStitle>
<script type="text/javascript">
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab = pass_enc.split(',');
var tab2 = pass.split(',');
var i,j,k,l=0,m,n,o,p = "";i = 0;j = tab.length;
k = j + (l) + (n=0);
n = tab2.length;
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
p += String.fromCharCode((o = tab2[i]));
if(i == 5)break;
}
for(i = (o=0); i < (k = j = n); i++ ){
o = tab[i-l];
if(i > 5 && i < k-1)
p += String.fromCharCode((o = tab2[i]));
}
p += String.fromCharCode(tab2[17]);
pass = p;
return pass;
}
String["fromCharCode"](dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30"));
h = window.prompt('Enter password');
alert( dechiffre(h) );
script>
head>
html>
代码分析
k = j + (l) + (n=0)即k = j
k = j = n即j=n,k=n
两个循环即
for(i = 0; i < n; i++ ){
p += String.fromCharCode(tab2[i]);
if(i == 5)break;
}
for(i = 0; i < n; i++ ){
if(i > 5 && i < k-1)
p += String.fromCharCode(tab2[i]);
}
又k=n=tab2.length
再对两个循环合并即
for(i = 0; i < tab2.length-1; i++ ){
p += String.fromCharCode(tab2[i]);
}
再加上p += String.fromCharCode(tab2[17]),tab2.length=17
可得
function dechiffre(pass_enc){
var pass = "70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65";
var tab2 = pass.split(',');
var i=0,p = "";
for(i = 0; i < tab2.length-1; i++ ){
p += String.fromCharCode(tab2[i]);
}
return p;
}
可见在逻辑上它只是将内容为逗号分隔的数字的字符串转成相应编码的字符串。
由于只对pass处理,所以不论输入什么都是输出"70,65,85,88,32,80,65,83,83,87,79,82,68,32,72,65,72,65"对应的Unicode字符串“FAUX PASSWORD HAH”
将代码修改,使得可疑字符串通过该函数解码,即可得到题解。
(在浏览器F12打开开发者工具,直接在控制台执行以下js代码)
function dechiffre(pass_enc){
var tab2 = pass_enc.split(',');
var i=0,p = "";
for(i = 0; i < tab2.length-1; i++ ){
p += String.fromCharCode(tab2[i]);
}
return p;
}
var flag=dechiffre("\x35\x35\x2c\x35\x36\x2c\x35\x34\x2c\x37\x39\x2c\x31\x31\x35\x2c\x36\x39\x2c\x31\x31\x34\x2c\x31\x31\x36\x2c\x31\x30\x37\x2c\x34\x39\x2c\x35\x30");
alert("Cyberpeace{"+flag+"}");