WebGoat学习——SQL注入(SQL Injection)
SQL注入(SQL Injection)
所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串,欺骗服务器执行恶意的SQL命令。攻击者通过web请求提交带有影响正常SQL执行的参数(arlen’ OR ‘1’=’1),服务端在执行SQL时参数的特殊性影响了原本的意思(select * from table where user=’arlen\’ OR \’1\’=\’1’;),执行了非预期的操作(select * from table where user=’arlen’ OR ‘1’='1’),从而是攻击者获取到了其他用户的信息或者对服务造成了攻击。
SQL注入操作简单,危害严重,现在也有比较成熟的防范措施,但是往往因为开发人员操作不当(例如:忘记过滤参数、不当的错误处理、配置失误)而产生风险,如果未被发现SQL注入漏洞并不影响任何系统功能,往往也不被察觉,一旦攻击者发现SQL漏洞,后果就比较严重。
SQL注入技术原理
在大多数web接口传入的参数最终都会反映到数据库表中的某一字段,例如用户登录的例子:
后端代码通过如下方法实现:
<?php
$con = mysql_connect("localhost", "xxx", "xxx");
if (!$con)
{
die('Could not connect: '.mysql_error());
} $db_selected = mysql_select_db("xxx", $con);
if (!$db_selected)
{
die('select db test failed: '.mysql_error());
} $user = $_REQUEST["user"];
$pwd = $_REQUEST["password"]; $sql = "select count(*) as count from user_info where user = '$user' AND password = '$pwd';"; $sql_query = mysql_query($sql, $con);
if (!$sql_query)
{
die(' mysql_query failed: '.mysql_error());
} $num = 0;
if (!$data = mysql_fetch_object($sql_query))
{
die('mysql_fetch_object failed: '.mysql_error());
}
else
{
$num = $data->count;
} if (0 >= $num)
{
echo "user[$user] login failed!";
}
else
{
echo "user[$user] login succ!";
} ?>
在后端实现是通过下面SQL来判断用户和密码是否匹配:
SELECT COUNT (*) as count FROM user_info WHERE user='arlen' AND password='';
如果服务器没有做过滤操作,可以令user=arlen’ or ‘1’='1来进行登录,即便完全不知道用户arlen对应的密码一样可以校验通过,php拼装的SQL语句为:
SELECT COUNT (*) as count FROM user_info WHERE user='arlen' or '' = '' AND password='';
这样只要user_info表中有数据就能通过login的校验。
SQL注入的原理就是在正常station 字段中注入特征字符,能组合成新的SQL 语句。SQL注入学习成本低,攻击性高,容易防范,但往往因为工作上的失误或者测试的不足而留下漏洞。
SQL注入防御
SQL注入原理简单易学,但防范起来却略为复杂,本质就是防止用户输入的不安全参数放映到具体的SQL语句上,例如:
1. web参数过滤,只允许约定的字符出现,比如数字、字母,100%解决问题,但过于暴力;
2. 对需要拼装SQL语句的参数做过滤,例如PHP自带的mysql_real_escape_string()函数,修改上述代码如下:
if (!$db_selected)
{
die('</br>select db test failed: '.mysql_error());
} $user = mysql_real_escape_string($_REQUEST["user"]);
$pwd = mysql_real_escape_string($_REQUEST["password"]); $sql = "select count(*) as count from user_info where user = '$user' AND password = '$pwd';"; echo $sql; $sql_query = mysql_query($sql, $con);
这样实际执行的SQL为:
select count(*) as count from user_info where user = 'arlen\' or \'1\' = \'' AND password = '';
3. 小心拼写SQL语句,一定要注意拼接SQL字段各个字段的来源,如果是外部传入的,根据不信任原则,一定要严格校验过滤;
4. 设置Mysql权限,只给访问数据库的web应用功能所需的最低权限帐户,这种只能降低损失,并不能避免注入;
5. 避免将数据库的错误信息直接返回,对于Mysql错误,程序一定要识别后再做返回,避免将错误描述直接返回给前端。
6. 小心、细心,SQL注入最常出现在开发人员粗心时;
7. 借助SQL注入扫描工具。
SQL注入其他资料
百度百科:http://baike.baidu.com/view/3896.htm
SQL注入危害:http://www.cnblogs.com/hkncd/archive/2012/03/31/2426274.html
最新文章
- SQL Server 2014如何提升非在线的在线操作
- IT行业的正式入门
- hihoCoder挑战赛14 -1223
- ROS主题发布订阅控制真实的机器人下位机
- u-boot 源码修改 bootcmd,IP ,BOOTARGS等参数
- 使用Areas(区域)分离ASP.NET MVC 项目
- [改善Java代码]不推荐使用binarySearch对列表进行检索
- SpringInAction读书笔记--第1章Spring之旅
- 使用C#画图(饼图折线图)
- SQL用replace替换文本部分内容
- vimtutor-summary
- 【MongoDB】windows平台搭建Mongo数据库复制集(相似集群)(一)
- JS左侧菜单-03
- mysql视图定义、原理、创建、使用
- 《EntrePreneur》发刊词
- My Stuck in C++
- Redis的主从复制(十一)
- OpenCV3计算机视觉Python语言实现笔记(三)
- HDU 2586 How far away(dfs+邻接表)
- JS实现数组去重方法总结(三种常用方法)
热门文章
- python matplotlib画图产生的Type 3 fonts字体没有嵌入问题
- Android中的sp与wp
- 《c程序设计语言》读书笔记--统计 行数、单词数、字符数
- [HDOJ4325]Flowers(树状数组 离散化)
- 在tomcat目录下启动tomcat,可以正常访问tomcat主页,然在在eclipse中集成了tomcat却访问不了tomcat主页,却能访问发布的项目
- Android开源库--PhotoView图片查看
- EntityFramework:支持同一事务提交的批量删除数据实现思路
- 51nod1678 lyk与gcd
- 设置app的状态栏样式
- Asp.Net正则获取页面a标签里的内容