黑客技术:一个“登录框”引发的安全问题(5)

警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。请确定应用程序对同一输入不做两次解码。对客户端提交的数据进行过滤,一般建议过滤掉双引号(”)、尖括号(<、>)等特殊字符,或者对客户端提交的数据中包含的特殊字符进行实体转换,比如将双引号(”)转换成其实体形式”,<对应的实体形式是<,<对应的实体形式是>以下为需过滤的常见字符

万能密码

漏洞描述:

其实我觉得万能密码和sql注入应当区分开来,所以我就分开写了。
众所周知,登录处是一条查询操作,一些程序可能是没有注意到,就写成了

$result=mysqli_query($link,'select * from user');        #执行$sql命令,查询user列表行内容 $row=mysqli_fetch_assoc($result);       #解析,通过用户名判断 里面行的内容密码是否正确 if ( $username===$row['username'] && $password === $row['password']) {     echo '登陆成功';  $_SESSION['uid'] = $row['id'] ;     header("Location:3.php?id=".$row['id']);  } else{     echo '请重新填写账户或密码';

这个时候就可以构造特殊的sql语句进行截断,造成永真,这样的话就可以越过查询完成登录

测试方法:

(1)用户名输入: ‘ or 1=1 or ‘ 密码:任意

(2)Admin’ – -(或‘ or 1=1 or ‘ – -)(admin or 1=1 –) (MS SQL)(直接输入用户名,不进行密码验证)

(3)用户名输入:admin 密码输入:’ or ‘1’=’1 也可以

(4) 用户名输入:admin’ or ‘a’=‘a 密码输入:任意

(5) 用户名输入:‘ or 1=1 – –

(6) 用户名输入:admin‘ or 1=1 – – 密码输入:任意

(7) 用户名输入:1’or’1’=‘1’or’1’=’1 密码输入:任意

示例:

这里的案例与上述的不太相同,他的查询多了一个判断动作,就是先判断用户名是否存在,存在的 时候才会进行下一步判断,判断用户名密码是否匹配,所以这里必须输入正确的用户名才行
admin’ or 1 #

alt

点击登陆,成功登录

alt

风险分析:

攻击者可通过万能密码直接登录后台,获取后台权限

修复方案:

1)对用户输入的特殊字符进行严格过滤,如’、”、<、>、/、*、;、+、-、&、|、(、)、and、or、select、union。

2)使用参数化查询(PreparedStatement),避免将未经过滤的输入直接拼接到SQL查询语句中。

3)Web应用中用于连接数据库的用户与数据库的系统管理员用户的权限有严格的区分(如不能执行drop等),并设置Web应用中用于连接数据库的用户不允许操作其他数据库。

4)设置Web应用中用于连接数据库的用户对Web目录不允许有写权限。

5)使用Web应用防火墙。

sql注入

漏洞描述:

所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。具体来说,它是利用现有应用程序,将(恶意)SQL命令注入到后台数据库引擎执行的能力,它可以通过在Web表单中输入(恶意)SQL语句得到一个存在安全漏洞的网站上的数据库,而不是按照设计者意图去执行SQL语句。 造成SQL注入漏洞原因有两个:一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。

测试方法:

1.通过web漏洞扫描工具进行对网站爬虫后得到的所有链接进行检测,或者手工判断是否存在注入点,一旦确认存在漏洞,可利用自动化工具sqlmap去尝试注入。几种常见的判断方法:

1)数字型。
?id=100 and 1=1 返回成功
?id=100 and 1=2 返回失败

2)字符型。
?name=rainman ’ and ‘1’=‘1 返回成功
?name=rainman ’ and ‘1’=‘2 返回失败

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxsdz.html