首页 > 代码库 > 工作中有关web安全的片段记录(不定时更新)
工作中有关web安全的片段记录(不定时更新)
1、有关html/css, js, php, cgi 的一些认识
当我们浏览器访问一个站点的静态文件,会把文件内容都下载下来(一般压缩),当然如果遇到外联的css/js,会再发起请求得
到。如果我们右键查看网页源代码,一片混乱没法看,可以使用firefox + firebug,可以清晰看到html dom tree,右键inspect
element 可以很快定位到tree node,由于是下载到本地,所以可以自己尝试修改element 查看效果,这并不影响服务器上的原始
文件。最后浏览器会开始渲染,包括执行js比如document.write() 之类,就呈现出现在我们所看到的网页模样。
CGI 的意思是啥?不是一种语言,也不是一种技术,而是一种模式。搜索一下CGI的定义Common Gateway Interface,简称
CGI。在物理上是一段程序,存放在服务器上。只要是提供HTML的服务器端程序都可以叫CGI,ASP/PHP/JSP这些都是,你用
C/C++写一个可以提供HTML的服务器端bin文件,也叫CGI,至于python/perl/shell 等脚本当然也能写cgi。
对一个 CGI 程序,做的工作其实只有:从环境变量(environment variables)和标准输入(standard input)中读取数据、处理数据、
向标准输出(standard output)输出数据。环境变量中存储的叫 Request Meta-Variables,也就是诸如 QUERY_STRING、
PATH_INFO 之类的东西,这些是由 Web Server 通过环境变量传递给 CGI 程序的,CGI 程序也是从环境变量中读取的。
标准输入中存放的往往是用户通过GET 或者 POST 提交的数据,这些数据也是由 Web Server 传过来的(客户端提交)。传统的
get 即是以 url?key1=value1&key2=value2的 形式传输过去。而post 形式(http请求包体)就比较多了,可以是传统的
key=value,也可以是json/xml 等形式,只是这些从标准输入得到后还需要经过一个解析的过程才能得到想要的key=value 形式的
呈现。
当然cgi 的body输出也是多种形式了,可以是简单的json/xml 形式,也可以是php echo 出一个text/platin or text/html,但要明
确的是php 等脚本是在服务器端执行的,也就是说当客户端访问test.php 时,server 先执行php脚本(php 会 读取标准输入,处
理过程,向标准输出输出数据),形象地来说,就是“戳一次就动一次”,根据用户输入的不同而产生不同的输出结果,即动态网
页的概念。注意,php, js css, 都可以和html 标签写在同个html 文件中。
有时候访问出现403 forbidden ,有种原因是 apache 设置的user,即运行httpd的user 是nobody(假设),对你想要访问的目
录/文件 没有读或者执行的权限,所以server 没办法读取执行文件,故 禁止访问。
2. 从浏览器 url发出的请求,如果进行了 urlencode,比如将 " 转成%22 发出去,在服务器端的php 接收到的是原始
的" 还是编码后的%22 得看用$GET["key"] 还是$_SERVER[‘QUERY_STRING‘],还要看在php 脚本内有没有做
addslashes 或者 htmlspecialchars 等函数调用,这样就能判断解析脚本 echo 出来的html 是怎样的组织形式,当然客
户端请求得到的html 也就是这样的形式了。
那为什么在chrome中对于< 等没有alert 弹窗呢,只是因为某些浏览器有anti_xss 模块或者filter,在浏览器解析html 的
时候 过滤掉这些危险的script 而没有执行。
htmlspecialchars 会把 < 编码成 < 还有 >,",‘ 等
addslashes() 函数在指定的预定义字符前添加反斜杠。这些预定义字符是:
单引号 (‘)
双引号 (")
反斜杠 (\)
NULL
这样就无法从url 传递带引号的参数来闭合引号来达到xss的目的,但是在charset=gbk 的情况下,如果参数含大于
127的值如%ae,后面再跟引号,虽然引号变成\‘, 但%ae\ 在gbk 看来也许是一个字符,当然我们看起来好像是一个
乱码,这样也会造成引号可以闭合,sql 注入也存在这样的字符集解析问题。设置了某种字符集,浏览器会按这种编
码去解析html 来展示给用户。
3. 反斜杠 \ 在script域内会起转义作用,而在html 标签内就是表示的字符含义,从下面alert()出来的字符可以得知。
<script> var test="a\""; alert(test); </script>
<script> var test=‘a\‘‘; alert(test); </script>
<script> var test=‘a‘; alert(test); </script>
<input type="text" value=http://www.mamicode.com/"a/" onm ousemove=alert(/xss/) " />
工作中有关web安全的片段记录(不定时更新)