Web入门之SQL注入(一)

昨天装好了工具,今天开始入门Web吧!就以Burpsuite官方靶场作为学习Web的起点

如下知识为刷Burpsite官方靶场所得,部分为自我思考,如有错误,希望各位提出:

首先我们先了解一下:

什么是 SQL 注入 (SQLi)?

SQL 注入是一种 Web 安全漏洞,允许攻击者干扰应用程序对其数据库进行的查询。它通常允许攻击者查看他们通常无法检索的数据。这可能包括属于其他用户的数据,或应用程序本身能够访问的任何其他数据。在许多情况下,攻击者可以修改或删除这些数据,从而导致应用程序的内容或行为发生永久性更改。

在某些情况下,攻击者可以升级 SQL 注入攻击以破坏底层服务器或其他后端基础设施,或执行拒绝服务攻击。

作用与注入方法:

1.检索隐藏数据:您可以在其中修改 SQL 查询以返回其他结果。

①检索隐藏数据:

如果该网站搜索使用的是union select,我们可以进行抓包,在搜索处后面进行修改,比较典型的为:

SELECT * FROM products WHERE category = 'Gifts' ->

SELECT * FROM products WHERE category = 'Gifts' OR 1=1--' AND

released = 1

在后面加上'or1=1('在我看来表示隔离,使得'前面语句与后面语句相隔开)由于1=1始终成立(所有商品满足1=1的条件),而--则截断后面信息,因此响应包将发回所有产品的信息.

②查列数:通过'union select null(n个)--看反应包返回值 (因为需要正确的列数才能得到正确响应)

③查列类型(null为通用类型,可输入数字或者字符看响应包确定列类型)

2.颠覆应用逻辑

如果登陆账号使用的sql查询来检查凭证,则比较经典的为在账号后面加上'--绕过登陆密码(清楚'与--原理即可知道为什么可以绕过)

3.从其他数据库表中检索数据

如果查询通过sql查询,我们可以通过在后面加上'union select username,password from users--

不过我们需要知道列名与表名才可以进行该操作

4.检查数据库

查询数据库类型和版本

不同的数据库提供了不同的方式来查询它们的版本。您经常需要尝试不同的查询以找到有效的查询,从而确定数据库软件的类型和版本。

确定一些流行数据库类型的数据库版本的查询如下:

Database type

Query

Microsoft, MySQL

SELECT @@version

Oracle

SELECT * FROM v$version

PostgreSQL

SELECT version()

(oracle中的*表示banner与其他列,其余在后面直接加上--即可)

列出数据库的内容

大多数数据库类型(Oracle 除外)都有一组称为信息模式的视图,这些视图提供有关数据库的信息。

您可以查询information_schema.tables以列出数据库中的表:

SELECT * FROM information_schema.tables

在 Oracle 上,您可以通过略有不同的查询获得相同的信息。

SELECT * FROM all_tables

(*可取TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE)

然后,可以查询information_schema.columns以列出各个表中的列:

SELECT * FROM information_schema.columns WHERE table_name = 'Users'

SELECT * FROM all_tab_columns WHERE table_name = 'USERS'(Oracle)

(注意:一般包含username跟password的表名包含users等关键词)

5.SQL盲注

什么是 SQL 盲注?

当应用程序容易受到 SQL 注入攻击,但其 HTTP 响应不包含相关 SQL 查询的结果或任何数据库错误的详细信息时,就会出现 SQL 盲注入。

对于 SQL 盲注漏洞,UNION攻击等许多技术都无效,因为它们依赖于能够在应用程序响应中查看注入查询的结果。仍然可以利用 SQL 盲注来访问未经授权的数据,但必须使用不同的技术。

解决方法:由于没有具体响应,因此通过触发条件

当TrackingId处理包含cookie的请求时,应用程序使用如下 SQL 查询确定这是否是已知用户:

SELECT TrackingId FROM TrackedUsers WHERE TrackingId = 'u5YD3PapBcR4lN3e7Tj4'

因此我们可以在cookie值后面加上判断语句来进行账号密码的判断

例如:

账号判断:TrackingId=xyz' AND (SELECT 'a' FROM users WHERE username='administrator')='a

密码判断:网站上说的是手爆(由于是刚入门),但是我感觉太麻烦,也想到了burpsuite的爆破模块,因此可改为 

TrackingId=xyz' AND (SELECT SUBSTRING(password,$2$,1) FROM users WHERE username='administrator')='$a$,然后索引特殊返回值welcome即可

(该办法要求在某处存在sql检查凭证,并在不同值时有不同返回)


版权声明:本文为qq_51459823原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。