login.php中使用了mysql_real_escape_string()函数对用户输入的字符串进行处理;会将特殊字符进行转义使之失去效果;但是~之后数据存储进数据库后转义的字符会恢复原样!
黑客通过构造数据的形式, 在浏览器或者其他软件中提交 HTTP 数据报文请求到服务
端进行处理, 提交的数据报文请求中可能包含了黑客构造的 SQL 语句或者命令。
服务端应用程序会将黑客提交的数据信息进行存储, 通常是保存在数据库中, 保存的
数据信息的主要作用是为应用程序执行其他功能提供原始输入数据并对客户端请求做出响
应。
黑客向服务端发送第二个与第一次不相同的请求数据信息。
服务端接收到黑客提交的第二个请求信息后, 为了处理该请求, 服务端会查询数据中已经存储的数据信息并处理, 从而导致黑客在第一次请求中构造的 SQL 语句或者命令在服务端环境中执行。
服务端返回执行的处理结果数据信息, 黑客可以通过返回的结果数据信息判断二次注
入漏洞利用是否成功。
在login_create.php注册页面中,使用了mysql_real_escape_string()但是数据还是会被存放在数据库中……
数据会被完整的记录在数据库中
数据库中有了我们的“小玩意”之后……
登录我们的账户,因为我们的账户是以admin\'#保存的,固然要这样的去访问和登录
前端提交user和pass后,会在修改密码页面修改密码
就这样我们成功的修改了admin的密码!为啥呢?
Sql 语句变为 UPDATE users SET passwd=”New_Pass” WHERE username =’ admin’ # ‘ AND password=’
也 就 是 执 行 了 UPDATE users SET passwd=”New_Pass” WHERE sername =’admin’
利用注册的admin’# 修改密码时候从数据库提取该数据 造成了数据 命令拼接
注入漏洞可以做哪些?SQL注入可以做什么?如果从一个普通人的角度看,第一想起的就是“万能密码”即通过构造SQL注入语句绕过密码验证。
获取数据库信息
发现SQL注入点后,通过猜解的方式获取当前数据库的库结构、表结构、字段内容,并通过Payload获取服务器的物理路径信息、用户信息、敏感数据信息等,如果成功的获得了数据库或服务器的高权限就可以“拖库”。
写入Shell
通过SQL注入漏洞执行写文件操作(写入Shell),例如:loadfile() into outfile 等函数都可以实现读写本地文件。当然读写文件的先决条件:文件的读写权限、文件为可读属性、了解文件的物理路径等。
SQL注入防御策略本文的SQL注入防御将会基于“常见SQL注入环境搭建(by:Mirror王宇阳)”中的搭建的环境做出防御措施。
过滤敏感字符将常用的SQL注入字符写入到黑名单中,然后通过程序对用户提交的POST、GET请求以及请求中的各个字段都进行过滤检查,筛选威胁字符。
# 部分敏感字符和字符串 delete from|from|count\(|drop table|update|truncate|mid\(|char\(|xp_cmdshell|exec master|netlocalgroup administrators|net user|[\{|\}|!|\\'] # 前端处理 var str = "select * from table where id=123"; var reg = /(.*?((select)|(from)|(count)|(delete)|(update)|(drop)|(truncate)).*?){2,}/i; return(reg.test(str));在字符过滤方面,通常过滤空格、括号、引号……等特殊字符,但是这些可以绕过的: