基于TCP/IP协议族的攻击技术及其防范
介绍TCP/IP协议(理论基础)
IP协议
IP协议工作在OSI参考模型的网络层上, 是TCP/IP协议的核心,所有的TCP,UDP,IMCP等协议的数据都以IP数据格式传输,几乎可以说是现代互联网所有网络层及以上协议的基础,所以在这里有必要拿出来单独做介绍。但是,IP是无连接的,不可靠的协议。之所以说它无连接,是因为IP分组是互不相关的。若要把它们联系起来,只能通过传输层及以上的网络协议。每个IP分组中都含有源地址和目的地址,因此可以独立的进行传输;之所以说它不可靠,是因为它不保证每个IP分组都能送到或按照原有顺序提交。
以下是IP协议的分组格式:
其中,
生存期 是用来设置数据报最多可以经过的路由器数。由发送数据的源主机设置,通常为32、64、128等。每经过一个路由器,其值减1,直到0时该数据报被丢弃。
协议 是用来标识IP数据报有效负载所用的高层协议的。
选项 主要用来进行网络测试或调试,定义了多种选项,设计安全,路由方面,常用的选项有:
严格源路由
松散源路由
记录路由
时间戳
TCP协议
不同主机的应用层之间经常需要可靠的、像管道一样的连接,但是IP层不提供这样的流机制,而是提供不可靠的包交换,TCP协议就是一个提供这样的服务的网络协议。TCP协议工作在OSI参考模型的传输层上,是一种面向连接的(逻辑上的)、可靠的、基于字节流的传输层通信协议。下面是TCP协议的数据包格式:
偏移 位0–3 4–7 8–15 16–31 来源连接端口 目的连接端口 32 序列号码(seq) 64 确认号码(ack) 96 报头长度 保留 标志符 窗口大小 128 校验和 紧急指针 160 选项字段 160/192+ 数据 其中标识符的标志位包括:
操作步骤(以Windows为例):
STAF/STAX的下载/安装和配置
在http://staf.sourceforge.net/ 上下载并安装STAF
在STAF的安装目录下新建services目录
下载STAX并解压到STAF目录下的services目录
修改STAF/bin/STAF.cfg文件,添加以下内容
SERVICE STAX LIBRARY JSTAF EXECUTE /{STAF/Config/STAFRoot}/services/stax/STAX.jar OPTION J2=-Xmx384m
SERVICE EVENT LIBRARY JSTAF EXECUTE /{STAF/Config/STAFRoot}/services/stax/STAFEvent.jar
SET MAXQUEUESIZE 10000 如图:
双击运行STAF目录下的startSTAFProc.bat文件,如下图:
在另一个命令行窗口或者另一台主机的命令行下:
如图表示连接成功
再列出服务列表,如图:
表示STAX安装并配置正确
至此STAF/STAX配置完成
新建并执行Job
在STAFservicesstax目录下,执行:
Java –jar STAXMon.
ZAP的使用
首先在https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project
下载ZAP,ZAP工具是使用Java编写的,所以基本上可以支持所有主流平台
这里下载的是Windows版
双击ZAP_2.4.3_Windows.exe, 按照提示完成安装
安装完成后, 在桌面上双击图标启动软件
由于只是试验而已, 所以选择No, 然后点 Start
进入软件后, 默认处于 Quick Start页面, 在此页面可以快速开始测试
在URL to attack出填写http://imxqd.xyz 即可对我的WordPress博客进行快速爬虫并扫描漏洞
经过一段时间的爬虫和扫描后, 可以得到ZAP扫描的结果
图中发现了258个中风险漏洞
点击其中的一个, 弹出对话框, 给出了漏洞描述和解决方法, 以及一些博客上关于此漏洞的博文的链接
此外还可以通过浏览器代理方式来扫描漏洞,ZAP默认的代理端口号为8080
可以在Google Chrome中使用SwitchyOmga(可在Google Chrome网上应用商店下载安装)来设置代理
启用代理:
然后再浏览器访问http://my.hfut.edu.cn
输入用户名,密码和验证码进入系统,在进入教学管理系统,进行一系列操作
ZAP也在同步录制中,最后ZAP没有发现严重漏洞,结果和http://imxqd.xyz大同小异
ZAP还有一些非常实用的小工具:
安全测试
针对我最近正在写的一个Web+Android的应用类库,测试其Web的前端部分
主动扫描地址: http://imxqd.xyz/feedback/?a=li&id=11&ver=vju0xlttbK
最终扫描结果,共发现1个漏洞,其中1个高风险漏洞
此漏洞中文名称为 目录遍历漏洞,指的是应用程序对文件路径没有检查导致服务器上的敏感文件/代码泄漏。此漏洞可能会导致源代码等敏感信息泄露。
修复方法, 由于我使用的服务器程序是Apache, 服务器脚本解释器为php, 在网上搜索解决方法,得到解决方法如下:
在php.ini中进行如下配置:open_basedir = 服务器上WEB目录的路径(注,路径最后需要加上斜杠作为结束),如:open_basedir = /var/www/html/
目前Android SDK中没有比较好的获取状态栏和导航栏高度的官方方法,下面给出一种较为靠谱的方法(来源于网络),方法利用了Java的反射机制.
private static boolean checkDeviceHasNavigationBar(Context context) { boolean hasNavigationBar = false; Resources rs = context.getResources(); int id = rs.getIdentifier("config_showNavigationBar", "bool", "android"); if (id 0) { hasNavigationBar = rs.getBoolean(id); } try { Class systemPropertiesClass = Class.forName("android.os.SystemProperties"); Method m = systemPropertiesClass.getMethod("get", String.class); String navBarOverride = (String) m.invoke(systemPropertiesClass, "qemu.hw.mainkeys"); if ("1".equals(navBarOverride)) { hasNavigationBar = false; } else if ("0".equals(navBarOverride)) { hasNavigationBar = true; } } catch (Exception e) { Log.e("Tool", "get navigation bar height failed!
这是Android开发最最基本的问题,最近才发现我对activity的生命周期的掌握并不深刻.
Activity 基本上以三种状态存在:
运行中
此 Activity 位于屏幕前台并具有用户焦点。
已暂停
另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 已暂停的 Activity 处于完全 Activity 状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。
已停止
该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于 Activity 状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但未与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。
如果 Activity 处于暂停或停止状态,系统可通过要求其结束(调用其 finish() 方法)或直接终止其进程,将其从内存中删除。(将其结束或终止后)再次打开 Activity 时,必须重建。
下面来一张经典的Activity的生命周期图:
对各个生命周期时间节点的回调函数的说明:
这张图包含了Activity的生命周期的详细过程和情况,这张图中有几个需要注意的地方,我们待会儿再说.
先说说一个Activity的一般情况下的生命周期:
onCreate->onStart->onResume->onPause->onStop->onDestroy
这种情况在打开一个单独的Activity然后退出的情况
在考虑两个Activity的情况,在MainActivity中打开Main2Activity,然后返回MainActivity,再退出,生命周期如下:
04-24 06:50:03.099 10661-10661/xyz.imxqd.test I/MainActivity: onCreate 04-24 06:50:03.139 10661-10661/xyz.imxqd.test I/MainActivity: onStart 04-24 06:50:03.139 10661-10661/xyz.imxqd.test I/MainActivity: onResume 04-24 06:50:03.
下载地址
app-release.apk{.wp2pcs-download}
若以上不能下载,请百度云盘下载
百度云盘地址:
http://pan.baidu.com/s/1eQIX48i
Android手机在横竖屏切换时,会调用当前Activity的onDestroy的方法来结束当前Activity实例,然后再重新创建一个新的Activity的实例,这造成了横竖屏切换相当于关闭应用重新打开了,fragment被重置到了默认的(第一个)了,我们该怎么办呢?
很容易想到,我们在系统结束当前Activity实例的时候,保存下当前的fragment,于是我们想到了,重写onDestroy()的方法。
我采用的是如下的方法
定义一个静态的Fragment对象
static Fragment curr_fragment = null;
新建一个方法
private void changeCurrFragment(Fragment fragment)<br /> {<br /> curr_fragment = fragment;<br /> FragmentManager fragmentManager = getFragmentManager();<br /> fragmentManager<br /> .beginTransaction()<br /> .replace(R.id.container, curr_fragment)<br /> .commit();<br /> }<br />
在以后切换fragment的时候,都调用这个方法,这样可以实现不用重写onDestroy()就保存了当前fragment
在onCreate()方法中初始化视图时,判断curr_fragment是否为null,如果为null则新建一个fragment实例,然后调用changeCurrFragment方法。
这样做看起来貌似是可以了。。。
但是!!!!
注意想一想Fragment的生命周期,Fragment随着Activity的消亡而消亡,所以这样是不可以的!!
你们可以试一试,这样横竖屏切换后将是空白
可以增加这样一个方法
<br /> private void recreateFragment()<br /> {<br /> if(curr_fragment != null)<br /> {<br /> System.out.println(curr_fragment.getClass().getSimpleName());</p> <p> switch (curr_fragment.getClass().getSimpleName())<br /> {<br /> case "Fragment1":<br /> curr_fragment = Fragment1.
abs(X) 返回参数X的绝对值
coalesce(X,Y,……) 返回第一个非空参数的副本。若所有的参数均为NULL,返回NULL。至少2个参数。
ifnull(X,Y) 返回第一个非空参数的副本。若两个参数均为NULL,返回NULL。
last_insert_rowid() 返回当前数据库连接最后插入行的RowID。
length(X) 返回X的长度,以字符计。
lower(X) 返回X字符串的所有字符小写化版本。
max(X,Y) 返回最大值。
nullif(X,Y) 当两参数不同时返回X,否则返回NULL。
quote(X) 返回参数的适于插入其他SQL语句中的值。字符串会被添加单引号。
random(*) 返回介于-231和231之间的随机整数。
round(X)或round(X,Y) 将X四舍五入,保留小数点后Y位。若忽略Y参数,则默认其为0。
sqlite_version(*) 返回所运行的SQLite库的版本号字符串。
substr(X,Y,Z) 返回输入字符串X中以第Y个字符开始,Z个字符长的子串。X最左端的字符序号为1。若Y为负,则从右至左数起。
typeof(X) 返回表达式X的类型。
upper(X) 返回X字符串的所有字符大写化版本。
在单参数聚集函数中,参数可以加前缀distinct。这时重复参数会被过滤掉,然后才传入到函数中。例如,函数count(distinct X)返回字段X的不重复非空值的个数,而不是字段X的全部非空值。
avg(X) 返回一组中非空的X的平均值。非数字值作0处理。结果总是一个浮点数。
count(X) 返回一组中X是非空值的次数。
count(*) 返回该组中的行数。
change_count() 返回受上一语句影响的行数。
max(X) 返回一组中的最大值。
min(X) 返回一组中的最小值。
sum(X)和total(X) 返回一组中所有非空值的数字和。若没有非空行,sum()返回null而total()返回0.0。total()的返回值为浮点数,sum()可以为整数。
date(日期时间字符串,修正符,修正符,……) 返回一个以YYYY-MM-DD为格式的日期。
time(日期时间字符串,修正符,修正符,……) 返回一个以HH:MM:SS 为格式的日期时间。
datetime(日期时间字符串,修正符,修正符,……) 返回一个以YYYY-MM-DD HH:MM:SS 为格式的日期时间。
julianday(日期时间字符串,修正符,修正符,……) 返回一个天数,从格林威治时间公元前4714年11月24号开始算起。
strftime(日期时间格式,日期时间字符串,修正符,修正符,……) 返回一个经过格式化的日期时间,它可以用以下的符号对日期和时间进行格式化:
%d 一月中的第几天,01-31
%f 小数形式的秒,SS.SSSS
%H 小时,00-24
%j 一年中的第几天,01-366
%J Julian Day Numbers
RecyclerView使用详解(一)
RecyclerView使用详解(二)
RecyclerView使用详解(三)
讲的不错
今天在进行Android Coding时,遇到了一个关于图像显示的问题,主要是图片过大,无法显示,log显示:
Bitmap too large to be uploaded into a texture
意思是图片超过了硬件加速所规定的高度。这个异常程序本身没有捕获,图片有可能会显示不出来,只能看log。在网上找了很久发现大多数都是直接把硬件加速关闭。
android:hardwareAccelerated="false" 但是我把硬件加速关闭后,可以明显地感受到滑动时画面的掉帧。于是我另寻它法。
于是我又找到了两个方法:
1.缩小图片后显示
2.重写ImageView的
public void drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint) public Bitmap decodeRegion (Rect rect, BitmapFactory.Options options) 方法,实现异步加载长图。
刚好,我的需求仅仅是要一个小图片(但我不能要求用户只选小图片啊),第一个方法刚好。
贴出我的部分代码
在Activity中:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK && isDone == false) { final Uri uri = data.getData(); Log.e("uri", uri.toString()); Toast.makeText(getBaseContext(),R.string.resize_doing,Toast.LENGTH_SHORT).show(); resizing = new ResizeBMPRunable(uri); new Thread(resizing).