0x00 弱类型初探
没有人质疑php的简单强大,它提供了很多特性供开发者使用,其中1个就是弱类型机制。
在弱类型机制下 你能够履行这样的操作
$var=1;
$var=array();
$var='string';
php不会严格检验传入的变量类型,也能够将变量自由的转换类型。
比如 在$a == $b的比较中
$a = ''; $b = 0; //一样为真
但是,php内核的开发者本来是想让程序员借由这类不需要声明的体系,更加高效的开发,所以在几近所有内置函数和基本结构中使用了很多疏松的比较和转换,避免程序中的变量由于程序员的不规范而频繁的报错,但是这却带来了安全问题。
0x02 知识豫备 php内核之zval结构
在PHP中声明的变量,在ZE中都是用结构体zval来保存的
zval的定义在zend/zend.h
struct _zval_struct {
/* Variable information */
zvalue_value value;/* value */
zend_uint refcount__gc;
zend_uchar type;/* active type */
zend_uchar is_ref__gc;
};
typedefunion_zvalue_value {
longlval; /* long value */
doubledval; /* double value */
struct{
char*val; intlen;
} str;
HashTable *ht; /* hash table value */
zend_object_value obj;
} zvalue_value;
其中php通过type判断变量类型 存入value
如上也就是php内核中弱类型的封装,也是我们后面讲的所有东西的原理和基础。
0x03变量的强迫转换
通过刚刚的了解,我们知道zval.type决定了存储到zval.value的类型。
当源代码进行1些未限制类型的比较,或数学运算的时候,可能会致使zval.type的改变,同时影响zval.value的内容改变。
当int遇上string
cp.1 数学运算
当php进行1些数学计算的时候
var_dump(0 == 'abcdefg');// true
var_dump(0 === 'abcdefg'); // false
var_dump(1 == '1abcdef'); // true
当有1个对照参数是整数的时候,会把另外1个参数强迫转换为整数。
相当于对字符串部份
intval再和整数部份比较,其实也就是改变了zval.type的内容 尤其注意的是,’1assd’的转换后的值是1,而‘asdaf’是0
也说明了intval会从第1位不是数字的单位开始进行
所有也有
这个例子就告知我们,永久不要相信下面的代码
mysql_query('update … …. set value=$a')
}
你以为这时候候进入该支的万无1失为整数了
其实$a多是1001/**/union…
cp.2 语句条件的疏松判断
举个例子
php的switch使用了疏松比较. $which会被自动intval变成0
如果每一个case里面没有break ,就会1直履行到包括,终究履行到我们需要的函数,这里是成功包括
if (isset($_GET['which'])){
$which=$_GET['which'];
switch($which) {
case0:
case1:
case2:
require_once$which.'.php';
break;
default:
echoGWF_HTML::error('PHP-0817','Hacker NoNoNo!', false);
break;
}
cp.3 函数的疏松判断
in_array ― 检查数组中是不是存在某个值 参数
needle 待搜索的值。
Note: 如果 needle 是字符串,则比较是辨别大小写的。 haystack 这个数组。
strict 如果第3个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是不是和 haystack 中的相同。
可以看到,只有加了strict才会对类型进行严格比较, 那末我们再次把整形和字符串进行比较呢?
var_dump(in_array("1bc",$array2));
它遍历了array的每一个值,并且作"=="比较(“当设置了strict 用===”)
结果很明显了
如果array1里面有个值为0,那末第1条返回就会为真//intval(‘abc’)=0
如果array2里面有个值为1,那末第2条就会为真//intval(‘1bc’)=1
array_search也是1样的原理
这里的利用就很广泛了,
很多程序员都会检查数组的值,
那末我们完全可以用构造好的int 0或1 骗过检测函数,使它返回为真
总结1下,在所有php认为是int的地方输入string,都会被强迫转换,比如
echo $a[2]; //根据php的offset 会输出'd'</br>echo $a[x];
<code class="php functions">echo</code> <code class="php variable">$a</code><code class="php plain">[x]</code>;//根据php的预测,这里应当是int型,那末输入string,就会被intval成为0 也就是输出'a'
当数组遇上string
这1个例子我是在德国的1个ctf中遇到,很成心思
前面我们讲的都是string和int的比较
那末array碰上int或是string会有甚么化学反应?
由php手册我们知道
Array转换整型int/浮点型float会返回元素个数;
转换bool返回Array中是不是有元素;转换成string返回’Array’,并抛出warning。
那末实际利用是怎样的呢?
…
}
可以发现,这个分支通过strcmp函数比较要求二者相等且“==”要求二者不相等才能进入。
strcmp() 函数比较两个字符串。
该函数返回:
0 - 如果两个字符串相等
<0 - 如果 string1 小于 string2
>0 - 如果 string1 大于 string2
这里的strcmp函数实际上是将两个变量转换成ascii 然后做数学减法,返回1个int的差值。
也就是说键入’a’和’a’进行比较得到的结果就是0
那末如果让$array和‘a’比较呢?
var_dump(strcmp($_GET[a],'a'));
这时候候php返回了null!
也就是说,我们让这个函数出错从而使它恒真,绕过函数的检查。
下面给出1张疏松比较的表格
0x04时时防备弱类型
作为1个程序员,弱类型确切给程序员书写代码带来了很大的便利,但是也让程序员忘记了
$array =array();的习惯。
都说1切输入都是有害的
那末其实可以说1切输入的类型也是可疑的,永久不要相信弱类型的php下任何比较函数,任何数学运算。否则,你绝对是被php出卖的那1个。
转自乌云
波比源码 » 浅谈PHP弱类型安全
levofloxacin 250mg sale levaquin order
avodart price celecoxib pill ondansetron drug
aldactone 25mg usa order valacyclovir 1000mg for sale order fluconazole 100mg for sale
order ampicillin 250mg sale purchase cephalexin online erythromycin 250mg without prescription
order fildena 50mg pills buy tamoxifen pill robaxin for sale
order generic sildenafil order estrace 1mg without prescription order estradiol 1mg online cheap
buy lamotrigine 50mg online buy minipress sale tretinoin cream ca
buy tadalis 20mg generic buy tadalafil 20mg pills voltaren tablet
indomethacin uk cheap indomethacin 75mg buy trimox without prescription
tadalafil 20mg pills Buy branded viagra purchase sildenafil pills
anastrozole pill Viagra medication order sildenafil 50mg without prescription
acheter 20mg du cialis cialis 5mg comprimГ© sildenafil 50mg sans ordonnance en pharmacie
cialis 20mg generika rezeptfrei kaufen sildenafil 100mg für männer viagra 50mg generika rezeptfrei kaufen
generic accutane 10mg azithromycin online ivermectin 4 tablets price
buy modafinil 200mg for sale Canadian pharmacy cialis pfizer generic acetazolamide
buy ramipril 10mg without prescription purchase temovate pill azelastine price
brand clonidine antivert cheap buy spiriva for sale
purchase terazosin online cheap cost sulfasalazine order sulfasalazine online cheap
olmesartan order online olmesartan 20mg cost purchase diamox pills
tacrolimus over the counter order urso pill urso 150mg canada
order imdur 20mg generic digoxin 250 mg telmisartan 80mg uk
order sertraline 100mg escitalopram oral oral viagra 50mg
buy imuran 100 mcg online order sildenafil 50mg generic sildenafil 25mg for sale
cheap tadalafil without prescription tadalafil 5mg pill viagra for sale
purchase revia pills order albenza 400 mg online cheap order aripiprazole generic
order medroxyprogesterone online cheap order biltricide 600mg pills order generic cyproheptadine 4mg
order isotretinoin 40mg sale generic isotretinoin 40mg purchase deltasone online cheap
order zithromax generic azithromycin pill buy gabapentin 100mg generic
buy furosemide 40mg generic lasix 40mg brand generic hydroxychloroquine 400mg
buy tadalafil 10mg pill order betnovate 20gm sale purchase anafranil sale
norvasc 10mg sale oral amlodipine 5mg tadalafil 10mg for sale
clozaril 50mg brand cheap clozaril buy dexamethasone 0,5 mg
sildenafil 50mg ca viagra 50 mg lisinopril online order
order generic zyvox 600mg real money slot machines real online casino
prilosec 20mg price ocean casino online best gambling sites
buy lopressor 50mg pill generic metoprolol 100mg levitra 20mg cost
cheap term papers money can t buy everything essay real money slots free spins no deposit
cialis coupons buy tadalafil 40mg for sale viagra for sale
xenical brand buy diltiazem 180mg online order acyclovir generic
cheap cialis generic buy inderal pills clopidogrel 75mg uk
tamsulosin 0.4mg uk buy spironolactone 25mg pills order generic aldactone
us cialis order ciprofloxacin 500mg without prescription cipro cheap
flagyl 400mg oral buy bactrim 480mg pills order bactrim 480mg without prescription
order tadalafil 5mg order sildenafil online buy viagra
order desyrel online cheap purchase aurogra for sale sildenafil price
viagra 50 mg buy tadalafil 5mg without prescription female cialis pill
sildenafil 50mg uk order nolvadex 10mg online budesonide medication
deltasone 10mg pills vermox cost mebendazole without prescription
retin drug retin us purchase avanafil sale
tadalafil 10mg usa order indocin 75mg without prescription indomethacin 75mg cost
buy lamisil 250mg online terbinafine online buy trimox online
naproxen 250mg cost order lansoprazole 30mg generic lansoprazole ca
purchase tiotropium bromide pill hytrin 5mg usa hytrin drug
order pioglitazone 30mg generic buy sildenafil 100mg online buy sildenafil pill
singulair brand order viagra online sildenafil 50mg cheap
cialis walmart Brand name cialis overnight free slot games for fun
cialis dosage 40 mg Buy cialis online without prescription cialis 20mg canada
gambling online help me write a thesis help me write my research paper
helpwithassignment leflunomide order online azulfidine 500 mg cheap
order asacol sale asacol 400mg drug avapro 300mg pills
buy diamox 250mg generic diamox 250 mg pill azathioprine 25mg price
digoxin 250 mg canada micardis 20mg sale brand molnupiravir
amoxil 500mg uk stromectol for humans for sale ivermectin 12mg for humans
coreg 6.25mg usa order elavil 50mg sale purchase elavil online cheap
indomethacin tablet buy tamsulosin pills cenforce us
tadalafil pill buy plavix 75mg generic amoxicillin pills
esomeprazole over the counter buy biaxin pill furosemide 100mg usa
cialis coupon walmart Overnight delivery cialis generic sildenafil 100mg
order minocycline capsules buy generic minocycline buy hytrin 5mg sale
order glycomet generic buy calan 240mg generic buy tamoxifen 20mg pill
order clomid for sale purchase lipitor pill order prednisolone 20mg online cheap
over the counter erectile dysfunction pills oral sildenafil 100mg buy proscar 5mg
purchase accutane sale order absorica pills purchase zithromax without prescription
ventolin inhalator online order ventolin 4mg augmentin 1000mg drug