All Posts

基于TCP/IP协议族的攻击技术及其防范

基于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+ 数据 其中标识符的标志位包括:

STAF自动化测试框架的基本使用方法

操作步骤(以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的使用

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]准确获取导航栏高度和状态栏高度

目前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的生命周期详解

这是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.

让体重飞demo版本发布!

下载地址 app-release.apk{.wp2pcs-download} 若以上不能下载,请百度云盘下载 百度云盘地址: http://pan.baidu.com/s/1eQIX48i

[Android]多Fragment下,横竖屏切换恢复界面问题

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.

[Android]SQLite函数大全

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

[Android]RecyclerView使用详解(1)(2)(3)

RecyclerView使用详解(一) RecyclerView使用详解(二) RecyclerView使用详解(三) 讲的不错

[Android]Bitmap too large问题的解决方法

今天在进行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).