昨天装好了工具,今天开始入门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检查凭证,并在不同值时有不同返回)