xsser.me平台搭建

注意:xsser.me平台不支持PHP 7, 请使用PHP 5环境搭建

首先下载源码,我是在ms08067平台下载的,链接:Xss测试平台(解压密码:ms08067.com)

下载之后得到XSS文件夹,放在/var/www/html下,文件目录如下:/var/www/html/XSS

image-20200713140254469

然后用建立一个新的数据库xssplatform,我用的phpmyadmin

然后修改config.php里面数据库连接字段:数据库地址、数据库的用户、密码、数据库(xssplatform)

初次安装将注册配置中的模式从invite改为normal

url配置中localhost修改为自己的域名,XSS改为自己的文件夹名,我的就是默认解压出来的XSS,所以就是http://localhost/XSS。

image-20200713140721146

再修改authtest.php中的域名位置:

在XSS文件夹中有个xssplatform.sql,在phpmyadmin中创建好数据库后导入库。

执行之后有9张表:

image-20200713141845337

进入数据库后执行sql语句把域名修改为自己的域名(http://localhost/XSS):

UPDATE oc_module SET
code=REPLACE(code, 'http://xsser.me', 'http://localhost/XSS')

然后在XSS文件夹内建立.htaccess伪静态文件,注意文件中的XSS要换成自己的文件夹名

我使用的是Apache:

RewriteEngine On
RewriteRule ^([0-9a-zA-Z]{6})/XSS/index.php?do=code&urlKey=1 [L]
RewriteRule ^do/auth/(\w+?)(/domain/([\w\.]+?))?/XSS/index.php?do=do&auth=1&domain=3 [L]
RewriteRule ^register/(.*?) /XSS/index.php?do=register&key=1 [L]
RewriteRule ^register-validate/(.*?) /XSS/index.php?do=register&act=validate&key=1 [L]
RewriteRule ^login /XSS/index.php?do=login [L]

然后进去注册,注册完了将config.php中的模式再从normal改成invite。

PDF如何添加目录

[toc]

[begin]不[/begin]知道大伙有没有遇到这样的问题:在网上找的很多PDF都没有目录,尤其是一些扫描版pdf,或者是有目录但是页码错误等等。这样非常不方便我们查阅和学习,为了解决这些问题,我们可以自己手动给PDF添加目录,添加的过程很简单,下面就教大家如何添加目录。

修改目录我们需要FreePic2Pdf(下载链接在后文)和一个文本编辑器(这里我使用的是sublime text)

查找目录

以《Orange’s 一个操作系统的实现》为例。这本书是扫描版的没有目录,如图:

image-20200131142740876

那么我们开始制作书签。首先我们要获得书签的文本。由于是扫描版,目录文本无法选中,因此我们在百度上搜索这本书的目录,一般这本书的百度百科都有目录。

image-20200131143106649

但是这个目录没有页码,所以我们再找其他的(当然你也可以手动输入目录)

找到一个合适的:

image-20200131143421497

将目录复制粘贴到文本编辑器中(这里我用的是sublime),我们需要修改文本的格式,PDF书签需要特定格式才能正确添加到PDF中。

修改目录

修改页码

首先需要注意的一点是页码。这本书的页码是从正文开始算的,也就是说前面序言目录等等都不算在页码的范围内,但是添加的目录中的页码需要算上序言,也就是说在这本书中第一章不是从第2页开始的,而是从22页开始的,所以页码需要进行修改。

修改页码有两种方式,一种是批量修改每个条目的页码,是比较麻烦的。另一种就需要用到FreePic2Pdf这个软件了。这里先介绍第一种。

image-20200131144118440

批量修改页码,我们使用excel进行修改。直接复制粘贴无法将目录正确的复制进表格中,文本只会出现在第一列,而我们的想法是让页码单独一页,这样我们就能批量修改了,那么我们首先修改目录文本的格式使之适配excel。

首先看我的原本的文本是这样的

image-20200131144817437

可以看到页码和标题间隔着一个空格(sublime中一个空格显示为一个 · )那么就可以通过一个可区分和定位的特征(数字前有一个空格)对这个位置的空格进行批量操作,将这一个空格替换成英文逗号。

ctrl+h进行替换。这里为了准确定位需要使用正则表达式进行替换(只要掌握基础的正则表达式语法即可,可以看看这篇教程)。\d代表一个数字,+表示匹配前面的字表达是一次或多次(也就是说\d可以是一个或多个)。我们要修改的是数字前面的一个空格,而数字要保留,所以我们输入空格+(\d+)()中括到的是我们要保存的,如图:

image-20200131152054846

可以看到sublime自动识别出了定位的范围,最好这时候再检查一下,看看有没有不是页码的地方也符合定位条件(数字前面一个空格),有时候标题也会出现匹配到的情况,这里检查之后都正常,只有页码匹配到了,非常好,接下来就将空格修改成逗号即可。表示取出第一个括号匹配的内容(就是第二个括号,这里就这一个括号)

所以替换的语句的意思就是替换成,+\d+

全部替换后如图:

image-20200131152727154

可以看到已经全部替换完成了。

保存成.csv文件,然后新建一个excel的空白文件,打开空白文件,点击数据->自文本

image-20200131160138386

然后选中csv文件,点击下一步

image-20200131160241926

分隔符号选逗号然后点下一步->完成-> 确认。

image-20200131160323494

这样就得到了待修改的目录。

image-20200131160422795

批量修改页码,不会改的看这里

然后复制粘贴到sublime。这样我们的页码就修改好了。同时在粘贴到sublime之后我们会发现页码前已经变成了制表符,节省了我们再批量修改成制表符的麻烦(sublime中制表符是以横杠:image-20200131162804210的形式表示)

修改章节分级

页码修改好后,我们还要修改章节的分级,例如1.1在第一章下,1.1.1在1.1下,如果你认为目录不用折叠也无所谓,那你可以不做修改,但是,如果你想要目录可以分级折叠,例如下图,那么我们还需要修改目录的格式。

image-20200131163225180

修改的方式是添加缩进,一级标题不添加缩进,二级标题加一个制表符,三级缩进加两个制表符,以此推类。

修改还是通过正则表达式进行修改。当然手改也可以。

本书中,上下篇是一级目录,所以不用修改,第一章第二章是二级标题,所以在开头加一个缩进。\t表示一个制表符。

image-20200131163748622

1.1是三级标题,所以有两个制表符,^表示字符串的开始,也就是说要匹配的是开头一个或多个数字,然后一个点然后接着一个或多个数字然后一个空格,也就是我们要找的三级标题。注意最后有个空格来限定是1.1而不是1.1.1。

image-20200131164158103

2.1.1是四级标题也就是三个制表符,不赘述了,如图:

image-20200131164600065

最终得到的目录如图:

image-20200131164635505

这样一个符合格式的目录就做好了。接下来就是添加目录了。

添加目录

添加目录需要用到FreePic2Pdf(链接:https://pan.baidu.com/s/1GCMIlwLSL1Z4eI64XrZeTQ 提取码:146l )

软件界面如图

image-20200131165159064

点击右下角更改PDF,选择从PDF取书签,把pdf拖进去点击开始,然后在你pdf的目录下会生成一个同名的文件夹,打开,有这两个文件。

image-20200131165420390

这个txt就是你的目录了,由于开始时没有目录,所以这是个空文件,将我们刚才修改好的目录复制进去并保存。然后再次使用FreePic2Pdf,选择往PDF挂书签,它默认就是刚才的文件,所以直接点击开始即可

image-20200131165725870

编辑完成即成功。打开PDF文件看看,成功挂上了书签!

image-20200131165831626


使用FreePic2Pdf解决页码偏移问题

这个方法在当时我写这篇博客的时候还不知道,现在补上。

FreePic2Pdf生成的文件夹中,除了有txt的目录以外,还有一个itf的配置文件。

使用sublime打开如下:

basepage表示目录中的第一页代表实际页面的数值,例如这里为4就说明目录的第一页对应pdf的第4页。

通过修改这个basepage就可以很方便的解决页码偏移问题。

Win10(家庭版)修改中文用户名为英文

[toc]

[begin]今[/begin]天用pip安装包的时候,pip提示我编码错误,上网查了之后发现是我的中文用户名导致的{{tuxue}}嗨呀那叫一个气啊,网上的方法试了一下没有解决,加上我之前也遇到过因为这个中文用户名而出现的莫名其妙的问题。所以干脆就一次性解决,直接把我的用户名改成英文的。网上有很多教程,但是我还是遇到一些奇奇怪怪的问题,所以把自己的修改过程记录下来,如果大家遇到和我一样的问题就可以参考参考。

注意:由于要修改注册表,加上很多人都是一个账户,因此修改用户名有一定风险,请谨慎修改。

修改步骤

0x01 创建Administrator账户

我们当前的账户是没有权限修改用户名的,如图所示,可以看到名字那里是灰色的:

image-20191119185124086

因此我们需要使用Administrator账户修改用户名。首先我们进入命令提示符(CMD),注意一定要以管理员身份运行

image-20191119183455906

然后输入如下命令:

net user administrator /active:yes

这样我们就创建了Administrator账户。你可以在windows菜单中点击自己的账户图标就可以看到多了一个administrator账户,如下图所示:

image-20191119183833169

然后重新启动电脑,使用Administrator账户登录,这时候会初始化,可能需要几分钟,耐心等待就好。

0x02 修改用户名

进入账户之后就可以修改用户名了,改成你想改的名字。然后按win+r,输入regedit然后回车打开注册表编辑器,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Profilelist,在该目录下的子目录中一个一个找,找到你要修改的那个用户,然后双击ProfileImagePath修改数据为你刚才修改的用户名,保存并退出。如图:

image-20191119185424746

修改完成后再按win+r,输入control userpasswords2:

image-20191119190219469

打开用户账户:

image-20191119190255465

点击你要修改的用户,修改用户名为你要修改的用户名,修改完成后保存关闭窗口。到此我们的用户名就已经修改完毕了,但是很多程序还不能正常运行,这是因为我们还没有修改环境变量。

0x03 修改环境变量

打开控制面板(不知道怎么打开就直接win+s然后搜索控制面板)

控制面板->系统->高级系统设置->环境变量,修改环境变量,把有旧用户名的值都改成新用户名即可。

重新启动电脑,修改完毕。

0x04 关闭Administrator账户

Administrator账户可以关闭也可以保留,如果要关闭那么我们再次打开管理员CMD,然后把上面的yes改成no运行即可。

避免采坑

0x01 输入命令提示错误

输入命令时提示“发生系统错误 5。拒绝访问。”这就是因为CMD没有足够的权限执行命令,需要以管理员身份运行CMD。

0x02 在另一程序中打开,请重试

登陆之后,修改用户名,系统提示文件夹或文件已经在另一程序中打开,请重试。这个问题我在注销原账户登陆administrator账户时遇到了,我的解决方法是直接重启,重启后直接登陆administrator账户,不登录原账户,这样就解决了问题。

0x03 右键崩溃

修改完后发现我在文件资源管理器中点击右键文件资源管理器就崩溃了,这时候使用火绒的右键菜单管理(其他杀毒软件应该也有)逐个排查之后发现是格式工厂的问题,关闭这个右键菜单项就好了。

0x04 环境变量修改后又恢复原值

我修改完环境变量之后发现我关闭再次打开环境变量,环境变量又恢复原值。后来经过上网查找发现是我没有修改用户账户的名字(就是通过control userpasswords2修改的那个),修改之后就好了。

一篇文章搞懂格式化字符串漏洞

[toc]

0x00 序言

[begin]刚[/begin]学pwn,做了两道攻防世界的pwn新手训练,真的是啥也不会,第一道题是连上就有flag我都不知道咋连,就菜到这种地步。一个格式化字符串漏洞看了一天。看了很多博客,最后终于弄明白了,感觉很多博客都对新手不是那么友好,刚学完,总结梳理一下,便于复习。也希望自己写的能帮到其他像我一样刚开始学的小白更快更清楚的明白格式化字符串漏洞。

0x01 格式化字符串

格式化字符串漏洞针对的是printf()函数,所以有必要先深入了解一下printf()函数和什么是格式化字符串。

首先让我们来看一下格式化字符串。

学过C的都知道printf(),在输出某个变量的时候我们一般会这样写:

int a = 100;
printf("%d",a);
// 100

这里的%d,实际上就是所谓的格式化字符串,维基百科是这样定义的:

格式化字符串(英语:format string),是一些程序设计语言在格式化输出API函数中用于指定输出参数的格式与相对位置的字符串参数,例如C、C++等程序设计语言的printf类函数,其中的转换说明(conversion specification)用于把随后对应的0个或多个函数参数转换为相应的格式输出;格式化字符串中转换说明以外的其它字符原样输出。

在我理解,就是你规定要输出的字符串的格式和位置,比如%d就是十进制整数格式,%s就是字符串格式,%x就是十六进制数格式等等。

再比如:

printf("Hello, %s", "Winny");
// Hello, Winny

%s告诉程序:“你应该在‘Hello, ’后面按照字符串格式来输出这个参数!”然后程序就乖乖的按照格式化字符串的要求输出了这个参数。这就是格式化字符串的作用。

比较常见和基本的格式化字符串有这么几个:

字符描述
%d输出10进制整数
%c输出字符
%s输出内存中的字符串,内存中存的是字符串所在的地址
%x输出十六进制数据
%p输出十六进制数据,区别是有前缀“0x”,实际上就是输出个指针,所以32位输出4字节,64位输出8字节
%n将printf已经打印的字符个数赋值给指定的内存地址中

实际上,这只是最简单的用法,格式化占位符的语法是:

%[parameter][flags][field width][.precision][length]type

d、c、s、x、p、n这些都是type。flags、field width、.precision、length这些不是很重要,这里就不说了。有兴趣可以在维基百科上看,这里说一下parameter。

Parameter可以忽略,也可以是:

字符描述
n$输出第n个参数

比如看下面的代码:

printf("the third is %3d, the first is %1d",1,2,3,4,5,6);
// the third is 3, the first is 1

可以看到,程序输出了第三个和第一个参数。至于n$有什么用,后面就会讲到。

回到上面的格式化字符串,最后的%n可能有的人看完描述觉得有点蒙,咱来举个栗子。在看代码之前,先插播一下,由于这个漏洞windows好像是有保护机制的,所以为了演示我所有的代码都在ubuntu上运行,同时编译时候按32位编译(我的ubuntu是64位的)。

编译命令为:

gcc -m32 test.c -o test

其中-m32就是按32位编译,要想在ubuntu上用-m32,先安装以下的库:

sudo apt-get install build-essential module-assistant
sudo apt-get install gcc-multilib g++-multilib

运行编译好的文件就在当前文件夹下输入以下命令:

./test

好,知道了如何在linux系统下编译运行文件,看下面的代码:

#include <stdio.h>

void main()
{
    int s = 0;
    printf("The value of s is %n",&s);
    printf("%d\n",s);
}
// The value of s is 18

你会发现s被赋值为了18,因为printf在%n之前已经输出了18个字符:“The value of s is ”(包括空格)然后%n就把18写入了s所在的地址对应的内容,也就是赋给了s。

现在你应该比刚才清楚一点%n的用法了吧。事实上,如果你敏感,你就会发现通过%n,我们修改了本来不能修改的内存的内容!这是极其危险的一件事!这也是漏洞修改内存值的核心!具体的使用会在漏洞部分详细介绍。

0x02 printf()函数

现在我们知道了格式化字符串,再来了解一下printf()。

printf()是C语言中为数不多的支持可变参数的库函数。就是说你想给printf()传几个参数都可以。根据规定,函数在调用的过程中,传入函数的参数从右到左逐个压入栈中。例如:

print("%d %d %d",1,2,3);
// 1 2 3

反汇编看的更直观一点:

push    3
push    2
push    1
lea     edx, (aDDD - 1FD8h)[eax] ; "%d,%d,%d"
push    edx             ; format
mov     ebx, eax
call    _printf

在这个例子中,我们制定了参数的数量为3和类型为十进制整数,那么printf()就会在栈中向前找三个值并按照十进制整数的形式输出出来。

还是这个例子,只不过我稍微改变一点:

print("%d %d %d",1,2,3,4,5);
// 1 2 3

反汇编看一下:

push    5
push    4
push    3
push    2
push    1
lea     edx, (aDDD - 1FD8h)[eax] ; "%d,%d,%d"
push    edx             ; format
mov     ebx, eax
call    _printf

函数将五个参数都压入了栈中,但是按照format的指示只按照十进制整数的格式打印了前三个参数。

可以看到,对于可变参数的函数,printf()本身并不知道传入参数的数量,也不知道在函数调用前到底有多少参数被压入栈中,所以它要求传入一个format来告诉它有几个参数,你有几个格式化字符串,printf()就认为你传入了几个参数。并忠实的按照format的指示,以指定的格式在指定位置打印指定数量的参数。

这就存在一个问题了。假如我们给printf()实际传递的参数数量小于我们所给的format怎么办?例如:

printf("%d,%d,%d\n",1,2);

这时候我们告诉printf():“我给你传递了三个参数,请把这三个参数安装十进制整数的形式打印出来!”而实际上,我们只给printf()两个参数,那这时候会发生什么呢?先自己思考一下,再往下看。

运行结果如下:

1566005116498

可以看到除了我们输入的参数1、2以外,printf()还打印出了一个值,这个值是什么呢?这个值就是栈上在保存的我们两个参数之后的第三个值,由于我们告诉printf()我们传了三个参数,所以它就会在栈上向前找三个值。也就是说,通过这种方式,我们可以读取本来不应该被读取到的内存的内容。

再来看一个例子:

printf("%x %x %x %x %x %x %x %x %x %x\n");

1566005556194

可以看到printf()将栈中format后10个内存的内容都以十六进制的形式打印了出来。

0x03 格式化字符串漏洞利用

有了上面的前期储备,我们就可以来聊聊格式化字符串漏洞的利用了。实际上,这个漏洞的产生可以说是因为程序员的偷懒。比如下面这个简单的程序:

char str[100];
scanf("%s",str);
printf("%s\n",str);

1566006155661

这样写是没有问题的。但是有的时候程序员会偷懒,写成这样:

char str[100];
scanf("%s",str);
printf(str);

没有format,但是程序也能正常运行。

1566006274630

但是这时候由于没有format,printf()实际上并不知道传入了几个参数,那么如果我们输入:aaa.%x会发生什么呢?

1566006429774

我们发现,printf()打印出来了本来不应该被打印出来的内存中的值。

这样一来,通过这个漏洞,我们可以实现任意内存的读和写。

任意内存读取

还是上面这个程序,我们可以用很多个格式化字符串来读取很多个内存地址的内容

1566023620247

也可以通过之前说的n$来读取特定偏移量的内存,比如说我想读取第六个内存中的内容,就可以这样构造:

1566023730070

现在我们就读取到了栈中第六个内存地址中的内容。实际上41就是A的十六进制ASCII码,这个地址中存的就是我们输入的“AAAA”(注意,并不是说printf()一直会把输入的内容存到偏移量为6的内存中,只是在这里是如此,具体存到偏移量为几的内存中需要我们自己通过构造很多个%x去找)。

通过%x可以读取内存中的值,通过%s可以读取以内存中的值为地址的字符串。

比如上面如果你用%s,你就会读取0x41414141为首地址上对应的字符串(如果有的话),如果该地址上没有,就会报段错误Segmentation fault。

1566024610292

这实际上是因为访问了不可访问的内存。例如该内存已经超过了系统所给这个程序的内存空间。我们要访问0x41414141,结果这个程序根本没有这个地址,那当然会报错啦。或者是这个内存是受系统保护的,我们不能访问。

我们再举一个%s的例子,在开始实验前,首先你要确保关闭了linux的内存地址随机化机制,否则每次运行程序,数据的地址都不一样,无法进行实验。关闭方法:

echo 0 > /proc/sys/kernel/randomize_va_space

关闭了之后就可以愉快的开始我们的实验了。我们看这个程序:

#include <stdio.h>
#include <string.h>

void main(int argc,char **argv)
{
        char str[100];
        char s[10]="hello pwn!";
        printf("%x\n",&s);
        strcpy(str,argv[1]);
        printf(str);
}

这里没有输出s的内容,如果我们想看到s的内容,那我们就可以通过格式化字符串漏洞达到目的。

攻击思路:首先我们看看“hello pwn!”所在的地址是什么,然后我们通过构造输入把这个地址存到内存中,再通过%s来读取“hello pwn!”。

构造地址可以通过输入字符串,让内存中存字符串对应的ASCII码这种方法来构造,比如如果要让内存中的值为44434241我们就可以输入ABCD(A的十六进制ASCII码为41,在内存中以十六进制存储且为小端序存储,所以41在最右边)。

但是如果地址像ff1b6800这样,那么我们就没法通过这种方式进行构造,因为我们很难找到该ASCII码对应的字符串并输入。这时候我们就要用到printf命令,将shellcode转义(直接输入\x00\x68\x1b\xff这样)。使用的时候把printf命令用反引号括起来。但是注意如果是用scanf输入字符串,则没法使用printf命令,而且scanf和命令行输入的shellcode没法被直接转义。因此,我们给的例子是使用strcpy赋值。

那么我们开始构造输入:

1566029291179

通过构造输入,我们成功改变了内存为ffffd4fe(偏移量是14)。

注意:这个程序没写好,如果输入参数个数不同,s的地址也会变化,比如我输入”`printf “\xfe\xd4\xff\xff”`.%x”时输出的就不是ffffd4fe而是ffffd52e。所以传入的参数数量需要固定,这一点需要注意。实际上,把s设置成静态的(在s前加static)就可以解决问题。下一个例子就改正这个问题。{{xiaoku}}

现在我们已经可以把偏移量为12的内存中的值变成s所对应的内存地址,那么我们把最后一个改成%s,即输出该内存值对应的地址中的字符串。

1566029414006

可以看到我们成功的读取出了s的内容。

任意内存修改

光读取还不够,最重要的是我们可以任意的对内存进行修改,这才是这个漏洞最可怕的地方。修改的方法其实上面已经说到一些了,那就是通过%n。

看一个例子:

#include <stdio.h>
#include <string.h>

void main(int argc,char **argv)
{
        char str[100];
        static int a = 0;
        printf("%x\n",&a);
        strcpy(str,argv[1]);
        printf(str);
        printf("\n%d\n",a);
}

我们的目标是修改a的值。先运行一下看看正常情况下是什么情况

1566032185561

可以看到a为初始值0,那么下面开始构造:

1566032317311

可以看到偏移量为10,把最后的换成%n

1566032384441

可以看到我们成功的改变了a的值,86是因为\x0c占一个字符,所以四个数有四个字符,“.”占一个字符,%x占8个字符,一共10个“.”,9个%x,最终加起来在%n前面一共输出了86个字符,所以是86。

如果要用n$的话,记得要在前面加反斜杠\转义:

1566033484942

最后在附上一个我自己写的小脚本,用来构造地址的,比如说要构造41414141,那么你需要输入的字符串就是AAAA。这个小脚本就是告诉你需要输入的字符串是什么,只需要你填入要构造的地址就行了。(如果ASCII码比较奇怪的可能就不行了,比如ASCII码是0x0B什么的)

'''
Author: Winny
Date: 2019.08.16
'''


def pocstr(addr):
    frag = []
    for j in range(0, len(addr), 2):
        frag.append(int(str('0x') + addr[j:j+2], 16))
    frag = frag[::-1]
    for s in range(len(frag)):
        print(chr(frag[s]), end='')


pocstr('41414141')
#输出结果:AAAA

Centos7下将域名指向子目录

[begin]本[/begin]来我把我的网站直接放在了根目录/var/www/html下,但是为了方便管理,就新建了一个目录wordpress,把网站放在了子目录下,但是这样的话首先我得改我网站上所有的链接(吐血),其次我输入完域名之后得加上后缀/wordpress,否则就会显示apache的界面。

这不行啊,所以就决定让域名直接解析到/var/www/html/wordpress,网上查阅资料后终于弄好了,现在记录下来

编辑/etc/httpd/conf/httpd.conf,在最后加上以下内容:


    Options Indexes FollowSymLinks
    AllowOverride None
    Require all granted


NameVirtualHost *:80

addDefaultCharset gbk
DocumentRoot /var/www/html/wordpress/
ServerName winny.work
ServerAlias *.winny.work
ErrorLog logs/winny.work-error_log
CustomLog logs/winny.work-access_log common

然后重启apache服务

service httpd restart

再次访问域名,就成功啦

Ubuntu搭建sql注入练习平台sqli-labs

[toc]
[begin]昨[/begin]天新买了一个ubuntu系统的服务器,打算当成实验靶机来用,所以想在上面搭建sqli-labs,打算什么时候把DVWA也装上去。以前装过sqli-labs,但是是在Centos下装的,而且没怎么记录,正好趁这次机会把他记录下来,避免以后别人再装的时候采坑。

由于是新买的,啥也没有,所以先更新一下

sudo apt-get update
sudo apt-get upgrade

更新完了之后修改一下root密码

sudo passwd

输入你想改的密码,之后就可以登录root账户了。

安装LAMP

开始正式安装之旅。首先是安装最基础的LAMP环境

安装Apache

sudo apt-get install apache2

安装完成后在浏览器输入你的ip地址,如果出现以下画面,说明apache成功安装。

file

安装Mysql

sudo apt-get install mysql-server mysql-client

安装完成后在/etc/mysql/debian.cnf里可以看到初始默认密码,注意这里的用户不是root,而是debian-sys-maint。

登录该用户:

mysql -u debian-sys-maint -p

输入默认密码,即可进入mysql,然后修改root密码,由于我是5.7版本,password字段已经被移除,所以使用如下命令修改密码:

use mysql;
update user set authentication_string=password('newpasswd') where user='root'and Host = 'localhost';
update user set plugin="mysql_native_password";
flush privileges;

第二步这里的newpasswd就是你要修改的密码。该命令执行完后显示

Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

说明修改成功。之后退出mysql,然后重新启动mysql

sudo systemctl restart mysql.service

试一下登录root用户

mysql -u root -p

输入刚改的密码,登录成功。

安装PHP

sudo apt-get install php7.0 libapache2-mod-php

安装完成后在/var/www/html/下新建test.php文件

vim /var/www/html/test.php

输入以下代码:

<?php
    phpinfo();
?>

保存之后在浏览器中输入你的ip/test.php,如果出现以下界面说明php安装成功。

file

然后执行以下命令(我就是因为没有安装这个导致sqli-labs半天安装不好)

sudo apt-get install php7.2-mysql

安装完毕后重启apache服务器

sudo service apache2 restart

现在就可以来安装sqli-labs啦!

安装Sqli-labs

首先你需要知道你的php版本!!!

首先你需要知道你的php版本!!!

首先你需要知道你的php版本!!!

重要的话说三遍!

如果是php5.x

访问 https://github.com/Audi-1/sqli-labs

如果是php7.x

访问 https://github.com/skyblueee/sqli-labs-php7

由于我是php7,所以我就用php7对应的版本

sudo apt-get install git
sudo git clone https://github.com/skyblueee/sqli-labs-php7 /var/www/html/sqli-labs

下载完成后进入sqli-labs文件夹,找到并修改sql-connections/db-creds.inc中你的数据库用户名和密码

<?php
//give your mysql connection username n password
dbuser ='root';         //修改成你数据库的用户名dbpass ='';             //修改成你数据库的密码
dbname ="security";host = 'localhost';
$dbname1 = "challenges";
?>

修改完成后浏览器输入你的ip/sqli-labs网站

file

点击Setup/reset Database for labs,如果出现以下界面:

file

表示sqli-labs已经安装完成!可以开始愉快的玩耍啦

修改wordpress数据库表前缀wp_

出于安全考虑,我想把wordpress默认的表前缀wp_改了,在这过程中遇到许多问题,经过一番谷歌搜索递归学习终于弄好了,记录下来

假设旧前缀为wp_,新前缀为sss_

进入wordpress所在数据库,查看都有哪些表

show tabels;

将数据库中所有的表前缀都改掉
例如:

RENAME table `wp_commentmeta` TO `sss_commentmeta`;

然后改完之后我发现我上不去我的网站了,后来发现我没有改wp-config.php

修改wp-config.php文件中的数据表前缀

$table_prefix  = 'wp_'; #将wp_改为sss_

好了,终于可以登上我的网站了,然后。。。。

我发现我可以登录,但是不能登录后台。

我去!好吧,开始谷歌

发现光改表前缀还不行,还要改几个字段的前缀

SELECT REPLACE(option_name, 'wp_', 'sss_') FROM sss_options;
SELECT REPLACE(meta_key, 'wp_', 'sss_') FROM sss_usermeta;

改完了发现还是不行,于是接着谷歌,发现表sss_options里面有个wp_user_roles要改为sss_user_roles。

然后问题来了,我不知道sql语句怎么写。。。

好吧只能拿phpmyadmin改了,下载安装phpmyadmin,下载好了之后需要修改配置

sudo vim /etc/httpd/conf.d/phpMyAdmin.conf

把带有Require ip xxxx字样的代码注释掉,然后添加Require all granted
编辑后如下:


   AddDefaultCharset UTF-8
   
     # Apache 2.4
     
      # Require ip 127.0.0.1  #注释掉
      # Require ip ::1   #注释掉
      Require all granted   #新添加
     
 
 
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   


   
     # Apache 2.4
     
      #Require ip 127.0.0.1  #注释掉
      #Require ip ::1   #注释掉
      Require all granted   #新添加
     
   
   
     # Apache 2.2
     Order Deny,Allow
     Deny from All
     Allow from 127.0.0.1
     Allow from ::1
   

登陆ip/phpmyadmin,登陆数据库傻瓜操作,修改完成。现在网站后台已经可以正常登陆了。

我的问题到这里就已经解决,再补充几个网上找的:

  1. ooxx_usermeta:把里面的 wp_capabilities, wp_user_level, wp_user-settings, wp_user-settings-time, and wp_dashboard_quick_press_last_post_id 字段名的 wp_ 全部改为 ooxx_
  2. 另外确保 ooxx_usermeta 表里面的 ooxx_capabilities 和 ooxx_user_level 的值如下
    ooxx_capabilities should be a:1:{s:13:”administrator”;s:1:”1″;}
    ooxx_user_level should be 10

Centos7搭建wordpress遇到的问题(持续更新)

本来是在树莓派上搭了wordpress,可是由于家里网络环境太不稳定,而且公网ip一直在变,所以就买了阿里云的服务器,先搭个站再说。系统是CentOS7,不是Raspbian,所以还是遇到了一些以前没遇到过的问题。记录下来。

0x00:搭建wordpress

安装LAMP及wordpress具体流程参照《CentOS7.4搭建LAMP环境安装WordPress详细图解》,但是我mysql的安装参照了《Linux(CentOS 7)环境下安装MySQL》,php我先安装了php5,系统提示我让我升级php,说我不安全,然后我又安装了php7,参照《CentOS7采用yum方式安装PHP7》。(虽然后来系统还是提醒我不安全。。。很迷)

0x01:wordpress更新失败

安装完毕后在更新wordpress的时候,系统提示我需要ftp服务器密码,解决办法如下:
找到wp-config.php

vim wp-config.php #编辑wp-config.php

在最后添加如下代码:

define("FS_METHOD", "direct");
define("FS_CHMOD_DIR", 0777);
define("FS_CHMOD_FILE", 0777);

然后给wordpress所在的目录设最高权限(我的是html/)

chmod -R 777 html/

最后重启apache服务

systemctl restart httpd.service

更新问题得到解决!

0x02:最大上传限制

想上传一张背景图,结果系统提示我超过最大上传限制,我一看限制2MB,你这是在逗我?所以修改一下php.ini。注意这个php.ini不在wordpress所在的文件夹里,要找到文件的位置,你可以在wordpress目录下新建一个info.php

vim info.php

在里面输入:

<?php phpinfo();?>

然后在浏览器中打开(你的ip)/info.php 就会出现

file

找到php.ini的位置,进行修改

修改php.ini中如下参数为你想要的值

post_max_size=64M
upload_max_filesize=40M
mamory_limit=128M

由于php.ini里东西很多,所以我们可以在vim里直接查找,按/就可以输入你想找的单词,按回车即可查找。例如:

/post_max_size

(vim具体查找命令请自行搜索)

然后重启,就可以解决了。

0x03本地localhost搬家导致wordpress无法连接

我们需要修改mysql设置。假设搬家前的地址为www.a.com,搬家后为www.b.com

首先进入mysql

mysql -u root -p

输入密码

成功进入mysql后再进入wordpress的数据库

use wordpress;    //你设置的wordpress的数据库

然后输入以下指令:

UPDATE wp_options SET option_value = replace(option_value,'www.a.com','www.b.com') WHERE option_name = 'home' OR option_name='siteurl';
UPDATE wp_posts SET post_content = REPLACE(post_content, 'www.a.com','www.b.com');
UPDATE wp_posts SET guid = REPLACE(guid, 'www.a.com','www.b.com');

这样我们就能用新地址访问wordpress了