0x00 简介
一个登录框
然后我们的目标是让SQL把有用的东西(账号密码)吐出来…
0x01 low难度
首先不管有没有用先看一下网页源码:
GET方法意味着我们只需要改一改网站url就可以了,如果POST的话还需要用bp(或者直接在输入框里打字)
下面怎么拖库呢…?
先看看什么样的输入可以拖库:
构造载荷
' OR '1'='1
推断查询语句类似于
SELECT first_name, last_name FROM ? WHERE user_id = '$id';
下面看看库里有啥:
构造负荷:
' UNION SELECT table_name,1 FROM information_schema.tables; #
返回出来了一堆东西
一通分析决定继续提取users中的信息。先看一下user中有哪些列。构造载荷:
' UNION SELECT group_concat(COLUMN_NAME SEPARATOR ','), 1 FROM information_schema.COLUMNS where Table_Name='users'; #
最后构造载荷:
' UNION SELECT user_id,password FROM users; #
到此为止,成功搞到id和密码。
0x02 medium难度
这里限制了id输入的选择,并且使用了POST方法。
POST方法的数据项是放在HTTP包体中的,因此我们直接BP抓包梭哈:
PS:Firefox经历了几次升级后,突然发现代理软件无法抓取到本地localhost的数据包了。解决办法如下:
- 浏览器url栏输入:
about:config
后回车 - 搜索框中输入:
network.proxy.allow_hijacking_localhost
设为true
此举允许代理抓取localhost数据包
0x03 hard难度
我们发现原站点在点击链接之后起了一个session
在session中输入就可以了…
构造的载荷和效果如下:
0x04 小结
SQL注入漏洞是最常见的漏洞,主要用自动化工具验证漏洞,当然手动验证也需掌握。主要分6步:
- 判类型
- 猜列数
- 确定顺序
- 获当前库
- 获所有表、字段名
- 下载数据
防范SQL注入漏洞最实用的做法为使用安全的查询方式实现命令与数据分离,java中可用PrepareStatment,c#可用parameter,php可用pdo。