最近在学习代码审计,写一篇关于login.php的登陆分析
存在问题
dvwaPhpIdsTrap()
logout()函数的意义
PDO
session()
unset
引用传值
引用返回
相关函数
相关函数
defined 定义一个字符串为常量
session_start 开启session
file_exists 文件/目录是否存在
require_once 包含一次
isset 是否存在变量并且非null
in_array 数组中是否存在某个值,区分大小写
set_cookie 设置cookie
array_key_exists 是否存在键
stripslashes 与magic_quotes_gpc有关
is_object 判断是否为对象
mysqli_real_escape_string mysql部分查询字符串进行转义
trigger_error,触发一个错误
md5() 返回一个md5加密的值
mysqli_num_rows mysql查询返回的行的数目
mysqli_query 传递mysql查询语句
mysqli_error 返回mysql错误,否则返回空字符串
mysqli_connect_error 返回mysql连接的错误,否则返回空
Header 发送原生http头
unset 释放变量
分析时,默认首次登陆。为了方便,直接将部分dvwaPage.inc.php部分函数截取
<?php
define( 'DVWA_WEB_PAGE_TO_ROOT', '' ); //定义路径
require_once DVWA_WEB_PAGE_TO_ROOT . 'dvwa/includes/dvwaPage.inc.php'; //文件包含
dvwaPage.inc.php与login.php有关的函数
&dvwaSessionGrab(),该函数是引用传递,是关键函数,管理着session
function &dvwaSessionGrab() {
if( !isset( $_SESSION[ 'dvwa' ] ) ) {
//如果没有全局变量$_SESSION[ 'dvwa' ],就令其为空数组
$_SESSION[ 'dvwa' ] = array();
}
return $_SESSION[ 'dvwa' ];//返回这个空的二维数组
}
dvwaSecurityLevelSet
function dvwaSecurityLevelSet( $pSecurityLevel ) {
//cookie相关设置
//httponly=true,代表客户端脚本无法访问cookie
if( $pSecurityLevel == 'impossible' ) {
//判断是否是impossible
$httponly = true;
}
else {
$httponly = false;
}
setcookie( session_name(), session_id(), null, '/', null, null, $httponly ); //整个根目录都有效的cookie
setcookie( 'security', $pSecurityLevel, NULL, NULL, NULL, NULL, $httponly );
} //null则代表有效路径为当前请求页面有效
dvwaPhpIdsEnabledSet
function dvwaPhpIdsEnabledSet( $pEnabled ) {
$dvwaSession =& dvwaSessionGrab(); ///引用传递,当dvwaSessionGrab()的值发生改变,$dvwaSession的值也会跟着改变
if( $pEnabled ) {
//如果为真,则将全局数组$_SESSION[ 'dvwa' ]['php_ids']设置为enabled
$dvwaSession[ 'php_ids' ] = 'enabled';
}
else {
//否则将断开绑定,即$dvwaSession['phpi_ids']值释放,但是$dvwaSessionGrab()还是指向原来的地址
unset( $dvwaSession[ 'php_ids' ] );
}
}
&dvwaSessionGrab,该函数是引用传递,是关键函数,管理着session
function &dvwaSessionGrab() {
if( !isset( $_SESSION[ 'dvwa' ] ) ) {
//如果没有全局变量$_SESSION[ 'dvwa' ],就令其为空数组
$_SESSION[ 'dvwa' ] = array();
}
return $_SESSION[ 'dvwa' ];//返回这个空的二维数组
}
dvwaPageStartup
function dvwaPageStartup( $pActions ) {
//传入的数组是array( 'phpids' )
if( in_array( 'authenticated', $pActions ) ) {
if( !dvwaIsLoggedIn()) {
//首次返回一个true
dvwaRedirect( DVWA_WEB_PAGE_TO_ROOT . 'login.php' ); //跳转到login.php
}
}
if( in_array( 'phpids', $pActions ) ) {
if( dvwaPhpIdsIsEnabled() ) {
//如果不存在$_SESSION['DVWA']['phpids'],则什么也不做,否则
//跳转到dvwaPhpIds.inc.php中的dvwaPhpIdsTrap()函数
dvwaPhpIdsTrap(); //******这里还没有看
}
}
}
dvwaIsLoggedIn
function dvwaIsLoggedIn() {
$dvwaSession =& dvwaSessionGrab(); //$dvwaSession=$_SESSION['dvwa'][]
return isset( $dvwaSession[ 'username' ] ); //不存在,返回一个false
}