龙空技术网

SQL注入之万能用户名

EMT00923 3144

前言:

如今大家对“php判断用户名是否正确”大致比较重视,朋友们都想要学习一些“php判断用户名是否正确”的相关资讯。那么小编在网络上搜集了一些关于“php判断用户名是否正确””的相关资讯,希望姐妹们能喜欢,兄弟们一起来学习一下吧!

分析代码

在安装的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("<script>alert('用户名或密码不正确!');window.history.go(-1)</script>");123456

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

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

原理

将找到的这段select语句

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

去除php格式改写为

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

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

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

这段语句中有逻辑与和逻辑或,以第一种方法为例(第二种方法用# 直接注释了后面内容,admin是数据库中存在的用户名,为真),在逻辑运算中,一般先做与运算,再做或运算:

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

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

实现

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

FUZZ' or 1=1 #****12

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

输入如下:

登录成功:

文章知识点与官方知识档案匹配,可进一步学习相关知识

标签: #php判断用户名是否正确