SQL注入

发生部位

SQL注入安全漏洞发生于应用程序和数据库之间。

原理

当攻击者在输入的字符串之中注入SQL指令,由于程序没有设置相关的字符检查,那么这些指令就会被数据服务器认为是正常的SQL指令并执行,因此,数据服务器就会遭到破坏或者数据被泄露出去。

示例

某个网站的登录验证的SQL查询代码为

strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"

恶意填入

userName = "1' OR '1'='1";

passWord = "1' OR '1'='1";

时,将导致原本的SQL字符串被填为

strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"

也就是实际上运行的SQL命令会变成下面这样的

strSQL = "SELECT * FROM users;"

因此达到无账号密码,亦可登录网站。所以SQL注入被俗称为黑客的填空游戏。

SQL注入方式

  • 数字型输入

    上面的示例就是一种数字型输入。再比如,在浏览器地址栏输入:learn.me/sql/article.php?id=1,这是一个get型接口,发送这个请求相当于调用一个查询语句:

    $sql = "SELECT * FROM article WHERE id =",$id
    

    正常情况下,应该返回一个id=1的文章信息。那么,如果在浏览器地址栏输入:learn.me/sql/article.php?id=-1 OR 1 =1,这就是一个SQL注入攻击了,可能会返回所有文章的相关信息。因为1=1一定是true,所以整个where语句永远是true,那么查询的结果相当于整张表的内容。

  • 字符型输入

    用户登录时调用接口learn.me/sql/login.html,首先连接数据库,然后后台对post请求参数中携带的用户名、密码进行参数校验,即sql的查询过程。假设正确的用户名和密码为user和pwd123,输入正确的用户名和密码、提交,相当于调用了以下的SQL语句:

    SELECT * FROM user WHERE username = 'user' ADN password = 'pwd123'
    

    由于用户名和密码都是字符串,SQL注入方法即把参数携带的数据变成mysql中注释的字符串。

    (1)’#’:’#'后所有的字符串都会被当成注释来处理

    SELECT * FROM user WHERE username = 'user'#'ADN password = '111'
    SELECT * FROM user WHERE username = 'user'
    

    (2)’-- ’ (–后面有个空格):’-- '后面的字符串都会被当成注释来处理

    SELECT * FROM user WHERE username = 'user'-- 'AND password = '111'
    SELECT * FROM user WHERE username = 'user'
    
  • 搜索型输入

    当在搜索框搜索的时候,称为搜索型。搜索型与数字型注入最大的区别在于:数字型不需要百分号闭合,而搜索类型一般要使用百分号来闭合。

如何防御SQL注入

  • 在设计应用程序时,完全使用参数化查询(Parameterized Query)来设计资料访问功能。
  • 在组合SQL字符串时,先针对所传入的参数加入其他字符(将单引号字符前加上转义字符)。
  • 如果使用PHP开发网页程序的话,需加入转义字符之功能(自动将所有的网页传入参数,将单引号字符前加上转义字符)。
  • 使用php开发,可写入html特殊函数,可正确阻挡XSS攻击。
  • 其他,使用其他更安全的方式连接SQL数据库。例如已修正过SQL注入问题的数据库连接组件,例如ASP.NET的SqlDataSource对象或是 LINQ to SQL。
  • 增强WAF的防御力

shell注入(OS命令注入)

发生部位

程序中调用系统命令的地方。

原理

通常情况下,Web应用程序会有需要执行shell命令的时候,有可能只是使用Unix sendmail程序发送电子邮件,或运行指定的Perl和C + +程序。从开发的角度来看,这样做可以减少程序的开发时间。然而,如果攻击者以构造特殊命令字符串的方式,把恶意代码输入一个编辑域(例如缺乏有效验证的输入框),从而传递到后台程序,恶意命令代码一旦执行,就会导致信息泄露或者正常数据的破坏,甚至可能导致恶意命令掌控该用户的电脑和他们的网络。

示例

String imageName = (String) params.get("imageName");
String cmd = "docker pull " + imageName;
Process process = Runtime.getRuntime().exec(cmd);
// ...

在上面的Java代码中,前端传递docker镜像名至后端服务器,由后端服务器调用docker pull命令拉取对应的镜像文件。当前端传入的imageName参数值为正常的镜像名称时(如nginx),会执行docker pull nginx命令拉取nginx镜像。而当前端传入的imageName参数值为nginx; echo hacked,即带有恶意指令echo hacked时,后端程序将在执行docker pull nginx成功后执行echo hacked命令。此处为了演示方便以及避免造成误操作,所以采用了直观且无害的echo命令。在终端直接运行该命令的结果如下所示:

# 示例中省略了执行结果与本文无关的一些输出信息
$ docker pull nginx; echo hacked
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
hacked # <- 此处为执行恶意命令的结果

shell注入方式

shell注入主要就是利用了一些符号的的特殊作用,下面介绍几种常见的符号。

  • ; 连续指令

    command1; command2表示执行完command1后继续执行command2,上面的示例就是采取了这种方式。

  • 管道 |

    command1 | command2表示先执行command1,然后将command1的输出作为command2的输入,再执行command2。例如:

    $ ping -c 4 127.0.0.1 | grep loss
    4 packets transmitted, 4 packets received, 0.0% packet loss
    # grep loss会输出ping -c 4 127.0.0.1结果中含loss字段的行
    
  • & 后台执行

    command1 & command2表示在后台执行command1,在前台执行command2。例如:

    $ ping -c 4 127.0.0.1 & echo hacked
    [1] 2333 # <- ping命令的进程号
    hacked # <- echo hacked的执行结果
    PING 127.0.0.1 (127.0.0.1): 56 data bytes
    # ... ping的执行结果
    

    注: ping命令涉及网络I/O,所以输出在echo命令之后,而非ping命令在echo之后执行。

  • &&||

    command1 && command2command1 || command2

    二者的区别为&& command2中的command2仅在command1执行成功后(退出码为0)执行,而|| command2中的command2仅在command1执行失败(退出码为非0值)后执行。

  • command$(command)

    当命令为command1 $(command2)时(command1command2``同理),command2的输出将作为command1的参数。例如用户输入的参数为$(echo hacked)时,程序在执行ping之前将会先执行echo hacked命令。

除了上述几种shell注入的方式以外,例如重定向(>>><<<)等也可能被攻击者所利用。

如何防御shell注入

  • 避免直接执行用户输入的命令

  • 对用户输入的参数进行校验

  • 过滤常见的符号

  • 使用黑白名单机制

  • 使用语言提供的转码方法

  • 使用最少权限的用户运行程序

参考

维基百科

博客1

博客2

博客3

安全漏洞之SQL注入和shell注入相关推荐

  1. PHP Taint 一个用来检测 XSS/SQL/Shell 注入漏洞的扩展

    什么是Taint ? An extension used for detecting XSS codes(tainted string), And also can be used to spot s ...

  2. SQL注入天书-ASP注入漏洞全接触

    引     言                 随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于这个行业的入门门槛不高,程序员的水平及经验也参差不齐,相当大一部分程序 ...

  3. 米斯特白帽培训讲义 漏洞篇 SQL 注入

    米斯特白帽培训讲义 漏洞篇 SQL 注入 讲师:gh0stkey 整理:飞龙 协议:CC BY-NC-SA 4.0 原理与危害 SQL 注入就是指,在输入的字符串中注入 SQL 语句,如果应用相信用户 ...

  4. Web TOP10漏洞之sql注入

    sql注入漏洞 目录 sql注入漏洞 信息搜集: 方法 1.判断是否存在注入点 2.数字or字符or搜索 3.提交方式 4.判断注入姿势 5.玩法^_^ 补充知识: 绕过过滤 其他数据库 信息搜集: ...

  5. Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)

    文章目录 注入 SQL注入 JDBC拼接不当造成SQL注入 框架使用不当造成SQL注入 不安全的反射 命令注入 代码注入 表达式注入 Spel表达式注入 OGNL表达式注入 模板注入 注入 SQL注入 ...

  6. 漏洞解决方案-SQL注入攻击

    漏洞解决方案-SQL注入攻击 前置知识 修复方案 代码参考 前置知识 SQL注入攻击,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令. ...

  7. SQLServer数据库注入-墨者学院(SQL手工注入漏洞测试(Sql Server数据库))

    本期来为大家讲解的sql注入题目是来墨者学院的SQL手工注入漏洞测试(Sql Server数据库). 地址:http://219.153.49.228:42295/new_list.asp?id=2( ...

  8. Web安全之SQL注入漏洞学习(七)-堆叠注入

    堆叠注入简介 堆叠注入是指注入的多条SQL语句可以一起执行.MySQL命令行中, 每一条语句结尾加; 表示语句结束.这样是不是可以多句一起使用.这个叫做 stacked injection. 堆叠注入 ...

  9. web基础漏洞之SQL注入漏洞

    先看菜鸟教程中HTTP的知识,HTTP是为了保证客户端与服务器之间的通信.HTTP的请求方法有两种:GET和POST.GET是从服务器上获得数据,POST是向服务器传递数据. Web 程序三层架构: ...

最新文章

  1. Swift 中使用 SQLite——批量更新(事务处理)
  2. 走近webpack(0)--正文之前的故事
  3. windows中进程详解
  4. 实例:Linux EXT3文件系统下成功恢复误删的文件
  5. python中浅拷贝和深拷贝分析
  6. weblogic 负载均衡搭建
  7. 4 文件操作 支持图片 视频 mp3 文本等
  8. 安装Debian7后遇到的问题与解决办法
  9. 【JavaScript】Uncaught TypeError: Illegal invocation
  10. php读写分离是什么意思,php mysql读写分离
  11. 服务器上在哪修改my.in,wordpress plugin的SVN使用方法
  12. 急救模式下安装rpm包
  13. 超10000支团队参赛,阿里云首届云原生编程挑战赛完美收官
  14. linux6.5修复引导,CentOS 6.5 修复grub引导
  15. html5如何将4张照片排列,如何将多张图片排列在一张图片呢?学会这两种技巧,轻松搞定...
  16. pr cpu100%_培训 | 秀米编辑器、Ps、Pr软件使用讲座
  17. C++单元测试框架Gtest的配置与使用过程
  18. 【NLP】⚠️学不会打我! 半小时学会基本操作 8⚠️ 新闻分类
  19. 操作系统--Linux 2.6下的NPTL(经典)
  20. 苹果ppt_惊艳!苹果发布会最爱用的PPT动画,居然这么简单

热门文章

  1. 动态路由和tab页切换路由
  2. Graphics2D画图
  3. keil cannot reset target shutting 新解决办法
  4. 树莓派3B+增加虚拟内存
  5. Win10系统CLSID大全介绍
  6. 怎样转换WPS格式,WPS怎么转换PPT格式
  7. ajax打开新窗口被浏览器拦截的解决办法
  8. 钉钉群机器人关键词自动回复_企业微信群机器人怎么用?企业微信群机器人有什么功能?...
  9. 2022年氧化工艺考试练习题模拟考试平台操作
  10. Nginx正则表达式locationrewrite