【Code-Audit-Challenges】Challenge 18:SQL注入

0x01 题目

#GOAL: get password from admin;
<?php 
    
error_reporting(0);

$link = mysqli_connect('localhost', 'xxx', 'xxx', 'test');
if (!$link) { 
    die('Could not connect to MySQL: ' . mysqli_connect_error()); 
} 

$link->set_charset("utf8");


function clean($str){
    if(get_magic_quotes_gpc()){
        $str=stripslashes($str);
    }
    return htmlentities($str, ENT_QUOTES);
}
$username = @clean((string)$_GET['username']);
$password = @clean((string)$_GET['password']);
$query='select * from user where username=\''.$username.'\' AND password=\''.$password.'\';';
var_dump($query); //提示:htmlentities函数的效果可以通过右键查看网页源代码来看效果
echo "<br />";
$result=mysqli_query($link,$query);
if(!$result || mysqli_num_rows($result) < 1){
    die('Invalid password!');
}

$row = mysqli_fetch_assoc($result);

echo "Hello ".$row['username']."</br>";
echo "Your password is:".$row['password']."</br>";
?>

0x02 解题

原题不是这样的,里面加了我自己的注释和数据库信息,有一个比较坑的是htmlentities()函数需要右键源代码才能看到效果。。

然后分析一下代码,首先已知用户名admin,目标是获取密码。其中username和password都使用了一个自定义的clean函数进行过滤,看一下clean函数,首先使用stripslashes函数去掉反斜杠,然后返回通过htmlentities()函数编码的字符串,并且在函数中使用了ENT_QUOTES,将单引号和双引号都进行实体编码,因此不能使用单引号进行注入,但是htmlentities函数是不编码反斜杠的,因此我们可以通过输入一个反斜杠,转义掉一个单引号,从而完成注入,payload如下:

?admin\&password=%20or%201=1%23
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,032评论 19 139
  • 之前积累了XSS 有一段时间,因为目前开始了一件有趣的工程,需要整合非常多的知识,其中Web 安全这一块出现最多的...
    刀背藏身阅读 9,295评论 0 16
  • 阅读后我们发现要找到flag就要找到和‘QNKCDZO’md5加密后相同的字符串。显然“碰撞”找对应字符串是几乎不...
    Sund4y阅读 892评论 0 0
  • Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行...
    付出从未后悔阅读 714评论 0 3
  • 0x00概述 宽字节注入主要源于程序员设置数据库编码与php编码设置为不同的两种编码,那么就可能产生宽字节注入 例...
    queena_阅读 1,318评论 0 1