PHP代码审计学习-PHP-Audit-Labs-day4
前言
这篇主要介绍了strpos函数,说明了php中弱类型比较导致的安全隐患
strpos()函数
strpos — 查找字符串首次出现的位置
作用:主要是用来查找字符在字符串中首次出现的位置
在False Beard题目中就存在一个判断问题
看下面代码
class Login {
public function __construct($user, $pass) {
$this->loginViaXml($user, $pass);
}
public function loginViaXml($user, $pass) {
if (
(!strpos($user, '<') || !strpos($user, '>')) &&
(!strpos($pass, '<') || !strpos($pass, '>'))
) {
$format = '<?xml version="1.0"?>' .
'<user v="%s"/><pass v="%s"/>';
$xml = sprintf($format, $user, $pass);
$xmlElement = new SimpleXMLElement($xml);
// Perform the actual login.
$this->login($xmlElement);
}
}
}
new Login($_POST['username'], $_POST['password']);
因为strpos函数在判断时匹配到会返回下标0,没匹配到就返回false。根据上面代码,只要两个都为ture就能进入到下面格式化字符串部分。
所以!strpos($user, '<') || !strpos($user, '>')
只要有一个为真即可,原本这里做了过滤不能出现<>符号,但由于strpos返回0,比较时会转换成false,从而造成XML注入。
payload:user=<"><injected-tag%20property="&pass=<injected-tag>
CTF练习题
这次题目采用的是Web-lottery这个题目,原题可以在攻防世界里面找到
function buy($req){
require_registered();
require_min_money(2);
$money = $_SESSION['money'];
$numbers = $req['numbers'];
$win_numbers = random_win_nums();
$same_count = 0;
for($i=0; $i<7; $i++){
if($numbers[$i] == $win_numbers[$i]){
$same_count++;
}
}
主要逻辑如上,这里因为用的是==号,所以比较可以绕过。
所以题解也很简单,只需要将输入的字符全部改为True即可。
payload:{"action":"buy","numbers":[true,true,true,true,true,true,true]}
小结
在php的弱类型比较很容易产生问题,在CTF比赛中比较常见,平时代码审计时也可以直接搜索比较判断处代码来找逻辑漏洞
博文中如存在错误请及时指出,不胜感激!