码迷,mamicode.com
首页 > 其他好文 > 详细

CTF-WeChall-第二天

时间:2020-09-17 21:27:08      阅读:28      评论:0      收藏:0      [点我收藏+]

标签:oba   int   第一步   直接   lang   代码   auto   amp   hal   

2020.09.10

奥力给,举步维艰的时候就是要一边做一遍记,虽然慢但是不要嫌弃,要不然就是举步不前??

做题搞起来

第一题 MySQL I

题目地址
技术图片
技术图片

  1. 关键代码:
<?php
# Username and Password sent? 检查是否是空
if ( (‘‘ !== ($username = Common::getPostString(‘username‘))) && (false !== ($password = Common::getPostString(‘password‘, false))) ) {
        auth1_onLogin($chall, $username, $password);
}
 function auth1_onLogin(WC_Challenge $chall, $username, $password)
{
        $db = auth1_db();
        
        $password = md5($password);
        # 用户名和密码直接连接,没有过滤和其他障碍,所以直接简单注入。
        $query = "SELECT * FROM users WHERE username=‘$username‘ AND password=‘$password‘";
        if (false === ($result = $db->queryFirst($query))) {
                echo GWF_HTML::error(‘Auth1‘, $chall->lang(‘err_unknown‘), false); # Unknown user
                return false;
        }
}
?>
  1. 构造username和password
    username = admin‘#
    password = hehe
  2. 绿了绿了,多么令人激动的颜色??
    技术图片
  3. 经验教训
    • 这个题有个比较坑的地方,我之前说过,以后用井号#,就用%23代替,但是这里是不可以的……??我分析了一下原因,我之前是用burp直接修改的url,所以转码之后的比较靠谱,因为内部可能会有转回来这个过程要走,但是这里应该是没有自动转吗这个流程要走,真拉垮??
    • ::这个符号第一次见,php中的基本语法,我也很拉垮,详细用法在这,总之一句话,就是用来访问其他类、父类中的方法或者参数,可谓是流氓符号??
    • 还有就是,如果知道字符串没有进行过滤是直接拼接的查询语句,就直接简单注入就可以了。额,好像这是废话。

第二题 MySQL II

题目地址
技术图片
技术图片

  1. 关键代码
<?php
/* TABLE STRUCTURE
CREATE TABLE IF NOT EXISTS users (
userid    INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username  VARCHAR(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
password  CHAR(32) CHARACTER SET ascii COLLATE ascii_bin NOT NULL
) ENGINE=myISAM;
*/
# Username and Password sent?
if ( (‘‘ !== ($username = Common::getPostString(‘username‘))) && (false !== ($password = Common::getPostString(‘password‘, false))) ) {
        auth2_onLogin($chall, $username, $password);
}
function auth2_onLogin(WC_Challenge $chall, $username, $password)
{
        $db = auth2_db();
        
        $password = md5($password);
        
        $query = "SELECT * FROM users WHERE username=‘$username‘";
        
        if (false === ($result = $db->queryFirst($query))) {
                echo GWF_HTML::error(‘Auth2‘, $chall->lang(‘err_unknown‘), false);
                return false;
        }
        
        #############################
        ### This is the new check ###
        if ($result[‘password‘] !== $password) {
                echo GWF_HTML::error(‘Auth2‘, $chall->lang(‘err_password‘), false);
                return false;
        } #  End of the new code  ###
        #############################
}
?>
  1. 这段代码的意思就是,先根据用户名,从数据库里查到密码,推测应该是密码的md5结果,因为他后来把查询结果跟我们输入的密码的md5进行对比。这个操作还是比较骚的,比一般的注入确实升级了一个水平,hhhhh~

  2. 关键点:这个题关键的点我认为在于源代码最前面,因为他给了数据库的源代码,所以我们知道他第一步中查用户名的时候的正常输出是三列,从这里我们就可以构造一下输出,因为他并没有对字符进行过滤,所以我们基本上还是可以肆无忌惮的操作??
    4.在这里的输入如下:
    username = hehe‘ UNION SELECT 1,‘admin‘,md5(‘hehe‘)#
    password = hehe

  3. 解释一波第4步输入:

    • username中:
    • 第一个hehe,是随便输的,只要是让第一个select输出为空就行,这样才能保证我们第二个select的输出能排在第一行,因为页面源代码文件中只读取了查询结果的第一行;
    • 第二个SELECT语句,分别对应正常输出的三列结果,对号入座。第一列无所谓,第二列是要求的admin用户,第三列是admin经md5后的值,我们只要保证md5()括号中的字符跟password中输入的一样就ok,相当于自己给他搞了一个密码;
    • password中:
    • 只要和username中的md5括号中输入的一样就ok。
    • 继续绿起来??
      技术图片
  4. 经验教训

    • 好像没啥经验教训,如果非要说的话,那就是,,,,,奥力给,前辈们tql;
    • 思路很重要,像这个题,他根据用户名查密码进行比对,我们就让控制他的输出,让他输入我们想要的结果,然后再在密码处输入我们想给的结果,这样就能匹配了。

第三题 Register Globals

题目地址
技术图片
技术图片

  1. 关键代码
    Register Globals
<?php
if (isset($login))
{
        echo GWF_HTML::message(‘Register Globals‘, $chall->lang(‘msg_welcome_back‘, array(htmlspecialchars($login[0]), htmlspecialchars($login[1]))));
        if (strtolower($login[0]) === ‘admin‘) {
                $chall->onChallengeSolved(GWF_Session::getUserID());
        }
}
?>
  1. 关键代码中比较关键的算是题目吧,这个题目给了我们方向。什么是Register Globals?身为一个菜??我一开始真是不知道啥意思,搜了搜之后了解个大概意思就是某个变量被弄成了全局变量,谁都能访问,url当然也ok,这就是这个题想告诉我们的。
  2. 解题payload:
    payload = http://www.wechall.net/challenge/training/php/globals/globals.php?login[0]=admin
  3. 这道题按照正常思路,login这个变量我们是没办法赋值的,因为他只是一个普通变量,但是如果在php的php.ini配置文件中将register_globals 的值设为on,那就是开启全局变量的意思,我粗略的理解为php文件中的变量全部变成了全局变量,就像是$_GET$_POST这种的通过url就可以直接访问和赋值的,所以就有了步骤3中的payload。
  4. 经验教训
    • php有个配置文件叫php.ini,文件里有个变量叫register_globals ,控制全局变量的开启与关闭;

CTF-WeChall-第二天

标签:oba   int   第一步   直接   lang   代码   auto   amp   hal   

原文地址:https://www.cnblogs.com/qiaowukong/p/13649255.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!