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
WebGoat学习——SQL注入(SQL Injection)的更多相关文章
- SQL注入(SQL Injection)案例和防御方案
sql注入(SQL Injection):就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. SQL注入攻击的主要危害包括:非法读取.篡 ...
- SQL注入——SQL Injection
本文部分内容转自:https://www.cnblogs.com/rush/archive/2011/12/31/2309203.html http://www.diybl.com/course/7_ ...
- Web安全相关(五):SQL注入(SQL Injection)
简介 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据 ...
- DVWA 黑客攻防演练(八)SQL 注入 SQL Injection
web 程序中离不开数据库,但到今天 SQL注入是一种常见的攻击手段.如今现在一些 orm 框架(Hibernate)或者一些 mapper 框架( iBatis)会对 SQL 有一个更友好的封装,使 ...
- 仿sql注入 sql
<?phpclass sqlsafe { //(and|or)\\b 表示以and和or结尾的单词如:aand,band,都可以匹配//如果匹配and或or则使用 \\b(and|or)\\b来 ...
- JDBC课程4--使用PreparedStatement进行增删查改--封装进JDBCTools的功能中;模拟SQL注入 ; sql的date()传入参数值格式!
主要内容: /*SQL 的date()需要传入参数值: preparedStatement().setDate(new java.util.Date().getTime()); 熟悉了使用Prepar ...
- 梨子带你刷burp练兵场(burp Academy) - 服务器篇 - Sql注入 - SQL injection UNION attack, determining the number of columns returned by the query
目录 SQL injection UNION attack, determining the number of columns returned by the query SQL injection ...
- SQL注入学习资料总结
转载自:https://bbs.ichunqiu.com/thread-12105-1-1.html 什么是SQL注入 SQL注入基本介绍 结构化查询语言(Structured Query Lang ...
- 干货 | 精选《SQL注入、渗透、反病毒》学习总结集锦给你们~
学到手的都是本事,如果觉得对你有帮助也欢迎分享给身边的基友们吧! 分享干货,手留余香哦~ 本次“开学季拜师活动”的徒弟们在师父的精心指导下,在短短5天内得到了迅速地成长,以前或当时遇到的问题都能够柳暗 ...
- 风炫安全Web安全学习第十节课 数字型的Sql注入
数字型的Sql注入 风炫安全Web安全学习第十一节课 字符型和搜索型的sql注入 风炫安全Web安全学习第十二节课 mysql报错函数注入 风炫安全Web安全学习第十三节课 CUD类型的sql注入 风 ...
随机推荐
- Babel 6 配置
Babel 6 较之前版本有些变化,几个比较重要的点. npm package babel 已经不在使用了,分成了下列几个 package babel-cli, 适用于命令行 babel-core, ...
- Python代码编辑器
PyCharm Community 说到PyCharm Community,我们就会想到它是一款免费的开源Python代码编辑器,不过这也是事实啦.PyCharm Community为我们提供了轻量级 ...
- Map和hash_map
map和hash_map 今天在写拼流的程序时碰到一个问题,要根据流的四元组的结构信息映射到该流的数据.也就是我在网络数据包拼接的过程中,要根据包的地址和端口信息,对应到其对应的一个流的数据上去,把端 ...
- plsql programming 19 触发器
挂起语句, 是指数据库 Hang 到那不能动了, 触发的. 1. DML 触发器 这种类型的触发器对于开发人员都很常见, 其他类型的触发器主要是给DBA使用的. 配置触发器,我们需要回答以下问题: 触 ...
- 基于Linux的oracle数据库管理 part1( 准备及linux基础 )
主要内容 1. 安装VMware tools (好处, 显示效果增强, 从虚拟机出来不需要alt+ctrl 切换) 2. Linux 启动过程, 方便以后oracle 自动启动与关闭 3. Linux ...
- C++ new、delete
C++中向系统申请堆内存的方法为使用new.new[]操作符,new申请单个对象的内存,new[]申请对象数组的内存.对应的delete.delete[]操作符将new.new[]操作符申请到的内存还 ...
- js之dom_2
动态脚本1 载入脚本文件 var s = document.createElement("script"); s.src = "test2.js"; s.typ ...
- HDU 1527 (Wythoff 博弈) 取石子游戏
对于Wythoff博弈中的两个数列,An和Bn有这样的关系: An + n = Bn, An = floor(φ * n) 所以我们可以根据a b的差值来计算一个新的a出来看看这两个值是否相等. 想等 ...
- 相对定位、绝对定位在IE6的问题
注意: 关于绝对定位,在IE6下定位元素的父级宽高都为奇数那么在IE6下定位元素的right,bottom都有一像素的偏差(left,top无偏差).因此应尽量使用偶数. 关于绝对定位,在IE6下父级 ...
- shell动态解析sql的binlog
#!/usr/bin #设置数据库连接 conn='mysql -hhost -Pport -uusername -ppassword' #获取最新的binlog文件 logfile=$($conn ...