CTFLearn Web-Grid It
打开网页有两个页面:登录和注册,首先尝试注册一个admin
用户,无果,猜测系统已有一个admin
用户;尝试下用户名注入,无果。于是先注册一个普通账号,登录进去看看进一步的功能。
登录后主要可进行以下几个操作:
- 添加
point
- 删除
point
添加point时为POST
:
https://web.ctflearn.com/grid/controller.php?action=add_point```
data: x=34&y=46
删除point时为``GET```:
https://web.ctflearn.com/grid/controller.php?action=delete_point&point=O:5:%22point%22:3:{s:1:%22x%22;s:1:%222%22;s:1:%22y%22;s:1:%222%22;s:2:%22ID%22;s:7:%221095693%22or%221;}
经尝试,添加point提交的参数限定为数字,无法构造其他数据上传,故先放在一边。观察删除时提交的参数,发现point
参数是一串编码后的php序列化
对象,反序列化看看:
__PHP_Incomplete_Class Object
(
[__PHP_Incomplete_Class_Name] => point
[x] => 2
[y] => 2
[ID] => 1095693
)
可以看到该对象包含了3个参数,分别描述所删除point的x坐标、y坐标以及ID,并且在序列化对象中这些参数是以字符形式存在(s
)。
尝试修改这些参数查看是否有限制,比如将ID中的数字改为字母:
/grid/controller.php?action=delete_point&point=O:5:%22point%22:3:{s:1:%22x%22;s:1:%222%22;s:1:%22y%22;s:1:%222%22;s:2:%22ID%22;s:7:%22109569a%22;}
发现并没有报错提示,说明没有对传入的类型做限制。在提交delete
请求时,会执行形如以下的操作:
delete from point_table where id = $id
传入的php序列化
对象是可控的,可以考虑进行sql注入
。
首先尝试一下修改delete
时提交的GET
请求参数看看是否执行成功,例如我们新建一个point,ID为1095693,x为67,y为41,则在burp中修改delete请求中point
字段的值:
/grid/controller.php?action=delete_point&point=O:5:%22point%22:3:{s:1:%22x%22;s:2:%2267%22;s:1:%22y%22;s:2:%2241%22;s:2:%22ID%22;s:7:%221095694%22;}
注意s
代表字符,s:
后面的数字代表长度,修改数值的时候要注意与长度对应,否则会提示:
Notice: unserialize(): Error at offset 62 of 70 bytes in /usr/share/nginx/html/web/grid/controller.phpon line 65
Fatal error: Call to a member function delete() on a non-object in /usr/share/nginx/html/web/grid/controller.php on line 66
提交请求后造次刷新页面,发现ID为1095694的point已被成功删除。
接下来构造id值进行sql注入,由于没有任何回显,所以这里只能采用盲注:
delete from point_table where id=xx and (other sql query)
如果query
为真,则delete
可执行成功,对应ID的point被删除。我们可以通过point是否被删除,来判断注入的s